微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TypeScript 定义,如何通过匹配 param 中的某个值来对函数的 param 进行不同的约束

如何解决TypeScript 定义,如何通过匹配 param 中的某个值来对函数的 param 进行不同的约束

我有一个函数需要定义,这样一个函数用法可以简化如下:

test({ flag: 1,payload: 123 }) // is ok
test({ flag: 1 }) // not ok
test({ flag: 2,payload: 123 }) // is ok
test({ flag: 2 }) // is ok
  • 如果 flag 是数字 1,则必须出现有效载荷
  • 如果 flag 不是数字 1,则不需要有效载荷

我正在考虑使用函数重载来编写这样的定义。但结果函数重载的所有定义都是“或”关系,我无法定义从 1

中排除 number 的类型
interface TestFunc {
  (data: { flag: 1,payload: number }): void
  // can I exclude 1 from number ?
  (data: { flag: number,payload?: number }): void
}

const test: TestFunc = (data) => {
  // ...
}

test({ flag: 1 }) // it should report type error

解决方法

您可以使用 extends 来检测您的 flag 属性是否等于 1 - 并相应地使用 payload 构建部件:

interface Payload {
    payload: number;
}

function test<T extends number>(data: { flag: T } & (T extends 1 ? Payload : Partial<Payload>)): void {

}

test({ flag: 1,payload: 123 }) // is ok
test({ flag: 1 }) // not ok
test({ flag: 2,payload: 123 }) // is ok
test({ flag: 2 }) // is ok

您可以在 playground 玩这个例子。

,

你可以达到类似于 negation 的效果:


type NotOne<T extends number> = T extends 1 ? never : T;

type WithOne = {
  flag: 1,payload: number
}

type WithoutOne<T extends number> = {
  flag: NotOne<T>,payload?: number
}

type Data<T extends number> = WithOne | WithoutOne<T>

interface TestFunc {
  (data: WithOne): void
  <T extends number>(data: WithoutOne<T>): void
}

const test: TestFunc = <T extends number>(data: Data<T>) => {
}


test({ flag: 1,payload: 123 }) // is ok
test({ flag: 2 }) // is ok

Playground

我创建了 NotOne 实用程序类型用于否定目的。如您所见,没有什么复杂的,它只是在值为 never 时返回 1

然后,您需要在工会的帮助下使非法状态不可代表Data<T>

然后,你只需要使用这个两个有效状态的联合来重载函数。

您可以在我的 blog

中找到非常相似的示例

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?