【发布时间】:2019-12-13 08:31:39
【问题描述】:
我想知道是否有编译器选项或类似的东西可以使传播对象变得严格。
请看下面的例子来理解我的意思:
interface Foo {
a: string;
}
interface Bar {
a: string;
b: number;
}
const barObject: Bar = { a: "a string", b: 1 };
// should give a warning because Bar has more properties (here b) than Foo
const fooObject: Foo = { ...barObject };
// actually prints 1
console.log((fooObject as any).b);
这样的事情可能吗?
【问题讨论】:
-
嗯,似乎有点不一致,因为
const fooObject: Foo = {a: "hello"}; fooObject.b = 1;确实会引发编译器错误,但传播不会。 -
是的,事实上
const foo: Foo = { ...bar, b: 2 }也会抱怨。不知道为什么。 -
另外
const foo: Foo = Object.assign({}, { ...barObject }, {somethingElse: true})不抱怨... -
@Kousha 此外,编译器知道
barObject的结构,因为它正确地将传播标记为安全,因为a属性匹配。如果您执行const fooObject: Foo = { ...({x: 1, y: 2}) };,则会引发错误,因为没有a属性。在这些情况下,它只是从不标记额外的属性。 -
好的,找到了更多关于这个的问题:stackoverflow.com/questions/48788052/… stackoverflow.com/questions/44525777/… stackoverflow.com/questions/47789057/… 基本上,这似乎是一个长期存在的事情。要么接受它(毕竟,编译器会阻止你使用
fooObject.b),要么编写一些只选择相关属性进行分配的辅助函数。
标签: typescript