如何解决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
我创建了 NotOne
实用程序类型用于否定目的。如您所见,没有什么复杂的,它只是在值为 never
时返回 1
。
然后,您需要在工会的帮助下使非法状态不可代表Data<T>
然后,你只需要使用这个两个有效状态的联合来重载函数。
您可以在我的 blog
中找到非常相似的示例版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。