首页 > 解决方案 > 是否可以在 typescript 中创建一个类型来表示除一组字符串文字之外的所有字符串?

问题描述

我想使用打字稿重载为我正在编写的函数提供智能感知。签名仅因参数类型而异。我遇到的问题是,如果有人在第一次重载中传入了与 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"));我希望智能感知告诉用户有一个错误。相反,由于跌倒,什么也没有发生。

标签: typescriptstring-literals

解决方案


您不能直接定义类型,Exclude<string, Exclusion>实际上只会导致stringtypescript 并没有真正具有否定类型的概念。有一个提议允许类似的东西(Here),但它还不是语言的一部分(在撰写本文时 3.3 是最新版本)。

综上所述,如果我们谈论一个不应具有特定值的函数参数,我们可以获得类似的效果。为此,我们需要一个泛型类型参数来捕获传入字符串的实际类型。然后我们可以键入参数 as 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

推荐阅读