[英]Typescript instantiate string union type
所以我有一個字符串聯合類型
type S = 'a' | 'b' | 'c';
我想初始化一個 S 類型的值,同時斷言它是 S 類型。使用變量,這很容易:
const s1: S = 'a';
const s2: S = 'z'; // error
但是,我只想實例化值本身,沿着'a' as S
但檢查'a'
的類型是S
。
確切的用例是我正在使用一個提供 function f(s: string)
的庫,但我想確保在調用它時,我只使用我認為合適的字符串來調用它。 由於 [afaik] 你不能從圖書館外部縮小簽名范圍,所以每次我使用f
時,我都在考慮做類似f('a' as S)
事情。
定義我自己的 function g = (s: S) => f(s)
不是一個很好的選擇,因為實際上f
的簽名看起來像f(s: string, t: T)
其中T
是一個復雜的庫定義類型我不確定是否已導出。
實現這一目標的最佳方法是什么?
使用字符串類型 ( TS playground ) 將外部 function 包裹起來:
const externalFn = <T>(s: string, t: T) => t
type S = 'a' | 'b' | 'c';
const yourFn = (s: S, t: Parameters<typeof externalFn>[1]) => externalFn(s, t)
如果您需要處理帶有多個參數的 function,您可以使用此答案( TS playground )中的想法:
type DropFirst<T extends unknown[]> = T extends [any, ...infer U] ? U : never
const externalFn = <T>(s: string, t: T) => t
type S = 'a' | 'b' | 'c';
const yourFn = (s: S, ...rest: DropFirst<Parameters<typeof externalFn>>) => externalFn(s, ...rest)
我最終制作了一個簡單的包裝器 function,如下所示:
function ok<T extends string>(s: T): T {
return s;
}
然后我可以使用f(ok<S>('a'))
,因為在我的例子中有多個函數和類型我想做這個驗證,並且單獨包裝 function 會很乏味且不可維護.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.