定义索引签名和扩展接口之间的冲突

时间:2018-04-18 17:35:30

标签: typescript

我有两个界面,humanbird。如您所见,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中创建标志以便不报告隐式错误之外是否还有其他解决方法

1 个答案:

答案 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
}