当我查看Object.assign时,我看到它使用了交集类型,但这种行为与我所期望的不一样。
我希望使用Object.assign将一些更改与旧对象合并,以创建一个新对象(在遵循不变的数据模式时,这是JS中的常见做法),并让TypeScript验证部件和结果是否正确,但似乎TypeScript允许通过任何操作而不会出错。
例如:
interface Thing {
name: string;
age: number;
fav: boolean;
}
let oldThing: Thing = {
name: "Aaa",
age: 123,
fav: false
};
let newThing: Thing = Object.assign({}, oldThing, {
name: "Bbb",
age: "abc", // should be type error
fake: "fakey" // should be unknown prop error
});这是在操场上。
为什么Object.assign允许这种不正确的分配给Thing?有什么办法能使这件事接近我的预期吗?
发布于 2016-10-06 22:06:56
您在这里直觉地期望出现错误的原因是,为Object.assign的返回值构造的交集类型是荒谬的,不能被任何实际值占用。然而,TypeScript无法验证这一点。此处来自Object.assign的返回值键入如下:
{
name: string,
age: string & number,
fav: boolean,
fake: string
}当然,没有两个都是string & number的实际值,但是编译器不知道这一点。它愉快地构造这个荒谬的类型,然后当您试图将它赋值给Thing时,验证Thing中每个属性的类型是否由返回值中的相应属性所满足。由于是这样的(每个name、age和fav都存在,并且至少满足了Thing中所需的接口),所以分配成功。
如果允许推断newThing类型,然后尝试将任何内容分配给age属性,您就会发现问题所在:
let newThing = Object.assign({}, oldThing, {
name: "Bbb",
age: "abc",
fake: "fakey"
});
newThing.age = 10; // Compiler error because 10 is not a string
newThing.age = "10"; // Compiler error because "10" is not a number发布于 2016-11-18 08:11:06
您可以强制TypeScript使用类型断言:即as Thing或<Thing>进行检查
interface Thing {
name: string;
age: number;
fav?: boolean; // You may need to mark this as optional depending on
// your requirement, otherwise TypeScript will
// generate missing prop error
}
//...
let newThing: Thing = Object.assign({}, oldThing, {
name: "Bbb",
age: "abc", // will cause type error
fake: "fakey" // howerver, no error for unknown prop
} as Thing);https://stackoverflow.com/questions/39906054
复制相似问题