是否可以在打字稿中创建一个类型来表示除一组字符串文字之外的所有字符串?

Is it possible to create a type in typescript that represents all strings except for a set of string literals?

我想使用打字稿重载为我正在编写的函数提供智能感知。签名仅因参数类型而异。我遇到的问题是,如果有人在第一个重载中传入了与 param1 匹配的内容,但传递了一个不匹配的 param2,那么它将落入通用重载。我希望不被接受并让智能感知将其标记为错误。

我试过使用 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")); 时,我希望智能感知告诉用户出现错误。相反,由于跌落而没有任何反应。

你不能直接定义类型,Exclude<string, Exclusion>实际上只会导致string打字稿并没有否定类型的概念。有人提议允许类似的东西 (Here),但它还不是语言的一部分(在撰写本文时 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