首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript Object.assign混淆

TypeScript Object.assign混淆
EN

Stack Overflow用户
提问于 2016-10-06 21:43:42
回答 2查看 10.7K关注 0票数 8

当我查看Object.assign时,我看到它使用了交集类型,但这种行为与我所期望的不一样。

我希望使用Object.assign将一些更改与旧对象合并,以创建一个新对象(在遵循不变的数据模式时,这是JS中的常见做法),并让TypeScript验证部件和结果是否正确,但似乎TypeScript允许通过任何操作而不会出错。

例如:

代码语言:javascript
复制
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?有什么办法能使这件事接近我的预期吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-06 22:06:56

您在这里直觉地期望出现错误的原因是,为Object.assign的返回值构造的交集类型是荒谬的,不能被任何实际值占用。然而,TypeScript无法验证这一点。此处来自Object.assign的返回值键入如下:

代码语言:javascript
复制
{
    name: string,
    age: string & number,
    fav: boolean,
    fake: string
}

当然,没有两个都是string & number的实际值,但是编译器不知道这一点。它愉快地构造这个荒谬的类型,然后当您试图将它赋值给Thing时,验证Thing中每个属性的类型是否由返回值中的相应属性所满足。由于是这样的(每个nameagefav都存在,并且至少满足了Thing中所需的接口),所以分配成功。

如果允许推断newThing类型,然后尝试将任何内容分配给age属性,您就会发现问题所在:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2016-11-18 08:11:06

您可以强制TypeScript使用类型断言:即as Thing<Thing>进行检查

代码语言:javascript
复制
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);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39906054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档