我有两个界面,human
和bird
。如您所见,human
中的所有内容都包含在值_human
键中。与bird
相同。
interface human{
_human: {
hands: number,
name:string
}
}
interface bird{
_bird: {
wings: number,
name:number
}
}
interface IEntity extends human, bird{ }
function foo(x: IEntity) {
let keys = Object.keys(x);
console.log(x[keys[0]].name);
}
要访问其内容,请在功能foo
中执行以下操作:
let keys = Object.keys(x);
x[keys[0]].name
但我收到错误:element implicitly has any type IEntity no index signature.
要解决此问题,如果我用bird
各个接口替换密钥human
和[key:string]
,我会收到此错误:
Property 'human' of type '{ hands: number; name: string; }' is not assignable to string index type '{ wings: number; name: number; }'.
我想知道除了在tsconfig
中创建标志以便不报告隐式错误之外是否还有其他解决方法
答案 0 :(得分:2)
问题是Object.keys
的返回值为string[]
,当您尝试使用字符串索引访问IEntity
时,您会收到错误消息。您可以通过告诉打字稿keys
的类型不是string[]
但更具体的类型(keyof IEntity)[]
来解决此问题。
所以对你的例子来说:
function foo(x: IEntity) {
let keys = Object.keys(x) as (keyof IEntity)[]; // Note the cast here
console.log(x[keys[0]].name); // x[keys[0]].name is inferred as string|number, no errors
}