網站搜尋

在 TypeScript 中有可能創建一種類型,表示除了某組字面值字符串之外的所有字符串嗎?


我想使用 TypeScript 的重載功能來為我正在編寫的函數提供 IntelliSense。這些簽名僅在參數類型上有所不同。我遇到的問題是,如果有人傳入的參數符合第一個重載的 param1,但 param2 不符合,它就會掉到通用重載上。我希望這種情況不被接受,並且 IntelliSense 能將其標記為錯誤。

我嘗試過使用 Exclude<> 的條件類型,但沒有成功。

type Exclusion = "Invalid";
type ExcludeString = Exclude<string, Exclusion>;

func(param1: "Activate", param2: (value: SomeInterface) => any): void;
func(param1: ExcludeString, param2: (value: any) => any): void;

當我呼叫 func("Activate", (value: NotSomeInterface) => console.log("Invalid")); 時,我希望 IntelliSense 能告訴使用者有錯誤。然而,由於穿透,什麼也沒有發生。

答案#1

你無法直接定義類型,Exclude<string, Exclusion> 實際上只會得到 string,TypeScript 並沒有真正的否定類型的概念。有一個提案允許類似的功能(在這裡),但它尚未成為語言的一部分(撰寫本文時,3.3 是最新版本)。

話雖如此,如果我們談論的是一個函數參數不應具有特定值的情況,我們也可以達到類似的效果。為此,我們需要一個泛型類型參數來捕捉傳入字串的實際類型。然後,我們可以將參數類型設為 Exclude<T, Exclusion>,這將產生預期的錯誤:

type Exclusion = "Invalid";
type ExcludeString = Exclude<string, Exclusion>;

function func<T extends string>(param1: Exclude<T, Exclusion>): void {

} 

func("SS")
func("Invalid") // error