【发布时间】:2019-05-14 10:15:33
【问题描述】:
我在 TypeScript 游乐场创建了 this example:
interface Test{
a: string
b: string
}
const object: Test = {
a: 'b',
b: 'c',
}
function testIt(): Test[] {
const data = [{b: '2', c: '3'}]
const prices: Test[] = data.length ? data.map((item) => {
return {
a: item.b,
b: item.c,
c: '2',
d: '3'
}
}) : [];
return prices;
}
从数组映射方法中的对象返回语句中删除 a 或 b 属性会导致 TypeScript 错误(如预期的那样)。
添加 c 或 d 或任何其他随机未知属性不会触发 TypeScript 错误。我怀疑这只有在接口包含 [x: string]: any 时才有可能。
那么为什么 Array.map 对接口上缺失的属性进行类型检查,而不是对附加/未知属性进行类型检查?
【问题讨论】:
-
因为要匹配接口,您必须实现它声明的所有内容。但是您可以拥有其他方法/属性,它仍然与所需的实现相匹配。
-
错了。如果您将
c: 'test'添加到上面示例中的 const 对象,您仍然会收到错误消息。对于动态属性,需要添加[x:string]:any;。但在这种情况下,不在 Array.map 中,这让我觉得很奇怪。 -
这是因为在这种情况下您使用的是对象文字,打字稿不允许来自基类型的未知属性。在 map 函数中,你让 typescript 推断出它工作的原因。
标签: typescript