接口与TypeScript中的通用Object不匹配

时间:2017-05-24 20:21:05

标签: typescript

我有一个接口foobar,其中包含两个属性" number"。 现在我尝试将类型为foobar的对象与通用对象定义进行匹配,其中每个属性的类型为数字。

interface foobar {
    a: number,
    b: number
}

function baz(param: {[key: string]: number}) {
    // some math stuff here
}

const obj: foobar = {
    a: 1,
    b: 2
};

baz(obj); // error happens here

这会导致以下TypeScript错误。

  

TS2345:类型' foobar'不能分配给' {[key:string]:number; }&#39 ;.类型' foobar'中缺少索引签名。

有没有什么方法可以将对象与接口匹配到只有类型为number的值的通用对象?

1 个答案:

答案 0 :(得分:1)

  

有没有什么方法可以将对象与接口匹配到只有类型为number的值的通用对象?

没有。 TypeScript不知道你没有写这个:

// OK: This is legal code
const obj1 = { a: 1, b: 2, c: "oops" };
// OK: Structural type matches
const obj: foobar = obj1;
// Crash when baz sees c: "oops"
baz(obj); // error happens here

在这种情况下,最好的选择是从这一行中删除类型注释:

const obj = {
    a: 1,
    b: 2
};

因为它是用对象文字初始化的const,所以TypeScript知道对象上没有任何其他属性,因此在需要索引签名的地方使用它是安全的(r)。添加类型注释会使该行为失败。