typescript - 是否可以在 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"));
我希望智能感知告诉用户有一个错误。相反,由于跌倒,什么也没有发生。
解决方案
您不能直接定义类型,Exclude<string, Exclusion>
实际上只会导致string
typescript 并没有真正具有否定类型的概念。有一个提议允许类似的东西(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
推荐阅读
- c# - 如何为json设置类?
- javascript - 将数据保存到数据库并发送电子邮件的 php 代码适用于 chrome 但不适用于 safari
- android - 必须在 Android Studio 中更改颜色的按钮问题
- python - 向 python 请求提供 Postman 的环境配置数据
- gerrit - zuul 事件触发时克隆 gerrit 存储库?如何停止?
- java - 需要确定程序中的正数、负数和零数,并将所有正数和负数分别相加
- tensorflow-lite - tensorflow-lite - 使用 tflite 解释器在输出中获取图像
- angular - Angular 材质:没有提供 dialogRef
- wikipedia-api - 从 Wikipedia API 只获取没有 JSON 的 wikitext
- python - PyQt5 在 Ubuntu 18.04 下无法删除标志 WindowStaysOnTopHint