[英]Typescript generic function with assertion about indexed type
我有興趣擁有一個可以在任何keyof T
上通用操作的函數,但斷言T[K]
是特定類型(即string
)。 我認為這個代碼示例最好地說明了這一點:
interface FooBar {
x: string;
y: number;
}
function foo<K extends keyof FooBar, ???>(propertyName: K, fooBar: FooBar) {
const value = fooBar[propertyName];
// I want the type of value to be `string`
}
我可以投入什么??? 將fooBar[propertyName]
輸入為string
而不是string | number
string | number
? 而且我還希望propertyName
只有一個有效值'x'
(顯然在實際情況下會有多個字符串字段,在這種情況下它將是'stringField1' | 'stringField2'
等。
這可以用 TypeScript 實現嗎?
謝謝!
您可以創建一種類型,該類型僅從源對象中提取與該對象中的字符串值對應的鍵
interface FooBar {
x: string;
y: number;
}
type StringKeys<T> = {
[P in keyof T]: T[P] extends string? P: never;
}[keyof T]
function foo<K extends StringKeys<FooBar>>(propertyName: K, fooBar: FooBar):string {
const value = fooBar[propertyName];
return value
}
您不必為 typescript 可以推斷出的屬性類型顯式具有類型參數。
StringKeys 類型通過為字符串值屬性創建映射類型[key]:[key]
('x':'x') 和為非字符串屬性創建[key]:never
('y':never) 映射類型來工作。 最后的 [keyof T] 將返回該對象屬性的所有潛在值。 Never 是特殊的,因此從這個列表中排除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.