传递索引类型时,Typescript的多余属性检查失败

时间:2018-09-17 12:40:59

标签: typescript

我最近通过将索引对象传递给采用带有完全可选属性的接口的方法而陷入困境。我本来希望这会引起过多的属性检查类型警告,但Typescript不会让它出错。

这是最小的情况:

interface SomeInterface {
  a?: string;
  b?: number;
}

interface IndexedInterface {
  [c: string]: SomeInterface;
}

// ...

function fn(t: SomeInterface) {
  console.log(typeof t.a); // should always be "string"
}

const something: SomeInterface = {
  a: 'string',
  b: 1,
};

const indexedThing: IndexedInterface = {
  a: something,
};

fn(something);    // no error, output: "string", this is fine
fn(indexedThing); // no error, output: "object", this is not fine

我是否可以通过某种方式使Typescript对这些情况发出警告,或者有人可以解释为什么我可以合法地将indexedThing传递给需要SomeInterface的函数?

1 个答案:

答案 0 :(得分:2)

似乎有人在某个时候考虑了该行为:“当目标是弱类型并且源具有至少一个属性,调用签名或构造签名时,就会进行弱类型检查”({{3} }。但是这个规则对我来说仍然没有意义。我继续提交this comment。如果您将属性(甚至是可选属性)添加到IndexedInterface,则会按预期报告错误。