gpt4 book ai didi

TypeScript Object.assign 混淆

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:06 25 4
gpt4 key购买 nike

当我查看 signature of 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
});

Here it is in the playground.

为什么 Object.assign 允许对 Thing 的错误分配?有没有办法让这项工作接近我的预期?

最佳答案

您凭直觉认为这里会出错的原因是为 Object.assign 的返回值构造的交集类型是荒谬的,不能被任何实际值占用。但是,TypeScript 无法验证这一点。此处 Object.assign 的返回值类型如下:

{
name: string,
age: string & number,
fav: boolean,
fake: string
}

当然不存在既是字符串又是数字的实际值,但编译器并不知道。它愉快地构造了这个荒谬的类型,然后当您尝试将它分配给 Thing 时,验证返回值中的相应属性是否满足 Thing 中每个属性的类型。既然是这样(nameagefav都存在,并且至少满足Thing<中需要的接口(interface)), 赋值成功

如果您允许推断 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

关于TypeScript Object.assign 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39906054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com