【发布时间】:2022-01-07 01:37:13
【问题描述】:
在 Typescript 中,当我检查变量时,然后分支会根据条件推断变量类型:
type MyType = 'val1' | 'val2' | 'val3'
const variable = 'val1' as MyType
if (variable === 'val2' || variable === 'val3') {
// typeof variable == 'val2' | 'val3'
}
上面的代码很啰嗦,尤其是当我检查两个以上的值并且我想用它替换它时
if (hasOneOf(variable, 'val2', 'val3')) {
// typeof variable == 'val2' | 'val3'
}
我部分满意的解决方案是:
const hasOneOf = <T, U extends T>(value: T | undefined, ...values: U[]): value is U => value !== undefined && values.indexOf(value as U) >= 0
但是只有当我明确定义类型时它才有效
if (hasOneOf(variable, 'val2', 'val3')) {
// typeof variable == MyType
}
// vs
if (hasOneOf<MyType, 'val2' | 'val3'>(variable, 'val2', 'val3')) {
// typeof variable == 'val2' | 'val3'
}
是否可以创建函数 hasOneOf 来推断泛型类型并返回由参数定义的联合 ('val2', 'val3' => 'val2' | 'val3') ?
【问题讨论】:
-
您是在寻找一种允许可变数量参数的解决方案,还是像您的示例中那样将其固定为 2?
-
您可以在提供参数时使用
constassertion:hasOneOf(variable, 'val2' as const, 'val3' as const),以防止'val2'和'val3'类型扩大到'val1' | 'val2' | 'val3' -
你在寻找类似tsplay.dev/w8KVVW的东西吗?
-
@jsejcksn 我正在寻找可变数量的参数
-
@captain-yossarian 除了它对字符串联合来说不是类型安全的,它可以工作!我将它更新为类型安全:tsplay.dev/wOz26W 但是它只绑定到一个联合类型,我希望它对任何联合类型都是通用的
标签: typescript types typescript-generics