網站搜尋

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);
}