使用泛型約束和keyof操作符動態訪問數組元素

我試圖在react中動態呈現一個表。通用屬性將確保動態索引數據數組的元素(至少我是這樣認為的)。我還希望只能將T類型的鍵傳遞給columns參數。因此,在這里擺脫泛型不是一種選擇。我還使用了Extract類型來分別渲染列,但排除它并沒有什么區別。

function Table<T, Key extends keyof T>({
  data,
  columns,
}: {
  data: T[];
  columns: Extract<Key, string>[];
  }) { 
  
  return (
    <div>
      {data.map((row) => (
        <tr>
          {columns.map((col) => (
            <td>{row[col]}</td> //this is where the error appears
          ))}
        </tr>
      ))}
    </div>
  );
}

這將產生以下錯誤:

Type 'T[Extract<Key, string>]' is not assignable to type 'ReactNode'.
  Type 'T[Extract<keyof T, string>]' is not assignable to type 'ReactNode'.
    Type 'T[string]' is not assignable to type 'ReactNode'.
      Type 'T[string]' is not assignable to type 'ReactPortal'.
        Type 'T[Extract<keyof T, string>]' is not assignable to type 'ReactPortal'.
          Type 'T[Extract<Key, string>]' is not assignable to type 'ReactPortal'.
            Type 'T[Extract<keyof T, string>]' is not assignable to type 'ReactPortal'.
              Type 'T[string]' is not assignable to type 'ReactPortal'.ts(2322)

為了隔離錯誤,我嘗試使用簡單的動態索引和通用約束再現錯誤:

function getKeyOfT<T, Key extends keyof T>(array: T[], key: Key) {
  return array[key];
}

生成以下錯誤:

Type 'keyof T' cannot be used to index type 'T[]'.ts(2536)

我已經研究了幾個答案,但它們似乎不同,它們的解決方案似乎沒有涵蓋我的問題:

  • 類型“test”不能用于索引類型“T”
  • 類型“K”不能用于索引類型“{[鍵在keyof K中]:V;}'.ts(2536)
  • 類型“1”不可分配給類型“T[Extract<keyof T,string>]”

正如其中一些人所建議的那樣,斷言類型應該可以解決問題。然而,在這種情況下,這似乎是多余的:

function getElementOfArray<T, Key extends keyof T>(array: T[], key: Key) {
  return array[key as keyof T];
} 
? 最佳回答:

嘗試隔離錯誤時,錯誤消息已更改,因為它是另一個錯誤。

要解決原始錯誤,請執行以下操作:

Type 'T[Extract<Key, string>]' is not assignable to type 'ReactNode'

這只是意味著TypeScript不知道T中有什么類型的內容,但它希望有一些可分配給ReactNode的內容。

我會嘗試修改函數的定義,以:

function Table<T extends Record<string, ReactNode>, Key extends keyof T>({
  data,
  columns,
}: {
  data: T[];
  columns: Extract<Key, string>[];
  }) { 
  
  return (
    <div>
      {data.map((row) => (
        <tr>
          {columns.map((col) => (
            <td>{row[col]}</td> //this is where the error appears
          ))}
        </tr>
      ))}
    </div>
  );
}
主站蜘蛛池模板: 又硬又粗又大一区二区三区视频 | 亚洲日韩中文字幕无码一区| 国产乱码精品一区二区三区四川人| 国产在线观看一区二区三区精品| 无码国产精品一区二区免费式影视| 成人影片一区免费观看| 精品人妻少妇一区二区三区| 夜夜爽一区二区三区精品| 波多野结衣一区在线观看| 国产一区二区三区小向美奈子 | 亚洲一区二区成人| 久久久久久综合一区中文字幕 | 国产人妖视频一区二区| 国产精品亚洲一区二区三区久久 | 无码少妇一区二区三区浪潮AV| 欲色影视天天一区二区三区色香欲 | 国产一区二区四区在线观看 | 一区二区三区在线免费看| 成人区精品一区二区不卡| 国产精品小黄鸭一区二区三区| 无码8090精品久久一区| 福利一区国产原创多挂探花| 天天爽夜夜爽人人爽一区二区| 一区二区三区电影网| 亚洲国产激情一区二区三区| 亚洲无线码在线一区观看| 亚洲一区二区三区AV无码| 国产一区二区三区不卡AV| 久久99国产精一区二区三区| 国产免费一区二区三区在线观看| 亚洲乱码日产一区三区| 污污内射在线观看一区二区少妇| 日韩免费无码一区二区三区| 在线一区二区三区| 国产亚洲日韩一区二区三区| 国产精品无码一区二区三区电影| 久久国产午夜一区二区福利 | 红桃AV一区二区三区在线无码AV | 精品国产一区二区三区2021| 91麻豆精品国产自产在线观看一区 | 中文字幕精品亚洲无线码一区应用|