簡體   English   中英

帶有關於索引類型的斷言的打字稿泛型函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM