簡體   English   中英

Typescript 實例化字符串聯合類型

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

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