gpt4 book ai didi

typescript - 在 TypeScript 中复制同键属性错误

转载 作者:行者123 更新时间:2023-12-01 13:13:23 24 4
gpt4 key购买 nike

在 TypeScript 中使用相同的键类型将属性从源复制到目标的正确方法是什么?

interface ITest {
first?(val: number, msg: string): void;
second?(): void
}

function copy(e: keyof ITest, source: ITest, dest: ITest) {
// TS2322:
// Type '(val: number, msg: string) => void' is not assignable to type '() => void'.
dest[e] = source[e];
}

我不明白为什么 TypeScript 看不到源和目标是同一类型并且我们使用相同的键类型。但是我们还应该怎么做呢?


我正在使用 TypeScript 3.6.4,tsconfig.json 如下:

"compilerOptions": {
"module": "commonjs",
"target": "es6",
"strict": true
}

最佳答案

TS3.5 引入了一个 change在写入键为联合的属性时加强类型安全。仅就类型而言,编译器无法区分您尝试执行的操作与此处绝对不安全的代码:

function badCopy(k1: keyof ITest, k2: keyof ITest, o: ITest) {
o[k2] = o[k1]; // error!
}

这里,键k1k2是完全相同的类型:keyof ITest。但是您很有可能试图盲目地将一个键的属性复制到另一个键的不兼容属性。因为 k1k2 中的键 values 可能不相同,尽管类型相同。那是不安全的,所以你会得到一个错误。


不幸的是,即使您确定 e 在读取和写入中是完全相同的值,该更改也会导致您正在做的事情被视为“可能不安全”。这目前被认为是 design limitation在 TypeScript 中,尽管他们可能会考虑 special-casing identical key identifiers .如果您关心这一点,您可能想转到相关的 GitHub 问题(看起来 microsoft/TypeScript#32693 仍列为“讨论中”)并给它一个 👍 或描述您的用例(如果它比那里列出的更引人注目) .


话虽这么说,但除非问题得到解决,否则还有变通办法:

编译器仍然允许 loophole其中 相同 类型可分配给自身,只要编译器看不到您正在使用联合类型作为键类型。通常你可以让你的功能更多generic ,像这样:

function copy<K extends keyof ITest>(e: K, source: ITest, dest: ITest) {  
dest[e] = source[e]; // no error now
}

或者,如果您不想这样做,只需接受您比此处的编译器更了解并使用 type assertion告诉它不要担心:

function copyAssert(e: keyof ITest, source: ITest, dest: ITest) {
dest[e] = source[e] as any; // one way
dest[e] = source[e] as ITest["first"] & ITest["second"]; // more explicit
}

希望其中一个适合您。祝你好运!

Link to code

关于typescript - 在 TypeScript 中复制同键属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380515/

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