typescript - 從給定類型的一組鍵中,對這些鍵設置兩個相應的實例會導致類型錯誤
給定以下情況:
type Dummy = {
a: string,
b: number
}
const a: Dummy = {
a: "a",
b: 1
}
const b: Dummy = {
a: "b",
b: 2
}
const problem = (keys: (keyof Dummy)[]) => {
keys.forEach(key => {
a[key] = b[key]
})
}
發生了 TS2322,無法找到解決方法。(或者用更好的文字來描述它)。
完整錯誤如下:型別 'string | number' 無法指派給型別 'never'。
答案#1
問題在於 keyof dummy 是 'a' | 'b',無法區分它們——TypeScript 無法足夠智能地推斷,如果 a[key] 指向一個字串,b[key] 也會指向可以包含字串的屬性。(目前它看到 b[key] 是 string | number,這無法指派給可能只是一個字串或數字,但不能同時是兩者的值。)
你需要使用泛型來正確地為鍵設置類型,以便允許賦值:
const problem = <T extends keyof Dummy>(key: T) => {
a[key] = b[key];
}
如果你有一個鍵的陣列,考慮先使用 Object.fromEntries 創建一個部分對象,然後再使用 Object.assign:
const problem = (keys: (keyof Dummy)[]) => {
const partial = Object.fromEntries(
keys.map(key => [key, b[key]])
);
Object.assign(a, partial);
}
