gpt4 book ai didi

typescript - 如何避免TypeScript中的动态keyof对象分配错误

转载 作者:行者123 更新时间:2023-12-04 08:20:03 25 4
gpt4 key购买 nike

假设我们的 TypeScript 代码如下所示:

type User = {
id: number,
name: string,
}

let user1: User = {id: 123, name: "Hello"};
let user2: User = {id: 456, name: "World"};

let keys: (keyof User)[] = ["id", "name"];

for (let key of keys) {
user1[key] = user2[key];
}

这给出了错误
Type 'string | number' is not assignable to type 'never'.

对于声明

user1[key] = user2[key];

如果我们将 keys 的定义改为

let keys: string[] = ["id", "name"];

错误消失了,但我们失去了类型安全。

有什么方法可以在保持类型安全的同时避免这个错误?

最佳答案

这里没有避免类型断言的好方法。在 TS 的最新版本中(我认为是 3.5 后),当通过索引写入时,写入的值必须与键指定的所有可能的属性值兼容。在你的情况下,这将是 number & string ,它减少到 never 因此错误。

根本原因是 TS 不只跟踪类型的变量,因此就类型而言,您的示例与:

let key1 = 'id' as  keyof User;
let key2 = 'name' as keyof User;
//Obvious error
user1[key1] = user2[key2] // same error, TS can't distingusih between this and your user1[key] = user2[key]


最简单的解决方案是使用类型断言,如果在您的情况下您确定这没问题:
type User = {
id: number,
name: string,
}


let user1: User = { id: 123, name: "Hello" };
let user2: User = { id: 456, name: "World" };
for (let key of keys) {
user1[key] = user2[key] as never
}


Play

或者(但不再是类型安全的)您可以使用一个小漏洞,其中 T[K] 可分配给索引值:
type User = {
id: number,
name: string,
}


let user1: User = { id: 123, name: "Hello" };
let user2: User = { id: 456, name: "World" };

let keys: (keyof User)[] = ["id", "name"];

for (let key of keys) {
set(user1, key, user2[key])
}

Play

关于typescript - 如何避免TypeScript中的动态keyof对象分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58656353/

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