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

时间:2019-02-01 21:42:34

标签: typescript string-literals

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

我已经尝试过使用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"));时,我想通过智能感知告诉用户出了错误。相反,由于掉线没有任何反应。

1 个答案:

答案 0 :(得分:1)

您不能直接定义类型,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