我有一個用于資料分析的小型 TypeScript 庫,其中包括指定 CSV 檔案列標題的名稱,然后在我的代碼中大量重復使用它們。
我一直在嘗試改進我的代碼,以便推斷出這些列名,因此我的 IDE 將開始提供它們作為自動完成建議,但是我無法按照我預期的方式進行推斷。
這是我的問題的最小可重現示例:
interface GenericInterface<T extends string> {
cols: {
[key in T]: string | number;
},
}
// I expect T to be inferred as 'NAME' | 'COUNTRY'
const fileInfoA: GenericInterface = {
cols: {
NAME: 'A',
COUNTRY: 'B',
},
};
打字稿游樂場
正如評論中提到的,在這個例子中,我希望泛型型別T被推斷為'NAME' | 'COUNTRY'基于我的cols屬性中物件的屬性名稱。但是,TypeScript 告訴我“通用型別‘GenericInterface’需要 1 個型別引數”。
當然,如果我確實明確提供了該字串聯合型別,錯誤就會消失。但在某些情況下,我正在處理 CSV 檔案,我需要知道 200 多個列的名稱,而且我真的不想通過包含該聯合和具有每個屬性的物件來重復自己。
我覺得我要么遺漏了一些非常明顯的東西,要么試圖做一些 TypeScript 不支持的事情。但是我無法在 TypeScript 檔案中找到或通過在線搜索其他地方的答案找到解決方案。
uj5u.com熱心網友回復:
你非常接近。為了推斷T您需要創建額外的功能。
interface GenericInterface<T extends string> {
cols: {
[key in T]: string | number;
},
}
const foo = <T extends string>(arg: GenericInterface<T>) => arg
// <"NAME" | "COUNTRY">(arg: GenericInterface<"NAME" | "COUNTRY">)
foo({
cols: {
NAME: 'A',
COUNTRY: 'B',
},
})
現在,T推斷為“NAME” | “國家”。
您可以在我的文章中找到有關函式引數推理的更多資訊
在這里你可以找到檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/372515.html
上一篇:ReactTS變數未及時更新
