javascript - 布尔值作为 TypeScript 中的对象键类型
问题描述
when
我想在 Typescript 中实现类似于 Kotlin 中的运算符的类似开关的功能。
示例用法:
const a = 30;
const b = 10;
const result = when(
{[a < b]: 'somethin'},
{[a > b]: 'somethin else'},
{[a >= b]: 'somethin else 2'},
)
>> result == 'something else'
它返回条件评估为真的第一个案例的值。
我试图做这样的事情:
type Case<T> = { [key: boolean]: T };
function when<T>(...cases: Case<T>[]) {
const index = cases.findIndex(c => c.hasOwnProperty(true));
return index >= 0 ? cases[index][true] : undefined;
}
但 TS 编译器抱怨An index signature parameter type must be either 'string' or 'number'.ts(1023)
.
另外,当我尝试做这样的事情时:
const foo = {[a > b]: 'something'};
TS 再次出错A computed property name must be of type 'string', 'number', 'symbol', or 'any'.ts(2464)
这可以在纯 JS 中轻松完成,因为计算属性中的布尔结果会自动强制(转换为)字符串。
我在网上找不到任何这样做的方法,所以我决定这样做:
function when<T>(...cases: [boolean, T][]) {
const index = cases.findIndex(([condition, _]) => condition);
return index >= 0 ? cases[index][1] : undefined;
}
when(
{[a < b]: 'somethin'},
{[a > b]: 'somethin else'},
{[a >= b]: 'somethin else 2'},
)
这很好,但我发现第一个示例的语法更令人赏心悦目。
我错过了什么还是当前规范的限制?
解决方案
TypeScript 具有强类型,你不应该期望这样的强制。JavaScript 中的对象键必须是字符串或数字。这就是 TypeScript 要求您不要使用布尔值的原因。您可以尝试以下解决方案:
type Case<T> = { [key in "true" | "false"]: T };
但是,您需要注意不能有两个相同的键:请参见下面的示例:
let sampleObject = {
"true": 'something',
"false": 'something else',
"false": 'something else 2'
}
console.log(sampleObject);
// will print { true: "something", false: "something else 2" }
// note that the second value is not available because
// you cannot have 2 "false" keys
```
推荐阅读
- python - sha-256 python 实现的错误
- java - 如何使用字体的“其他版本”?
- php - DateTimeZone::__construct():未知或错误的时区 (LHDT)
- hyperledger-fabric - 无法将 Composer 1.6.3 版本的 Composer 与 Fabric 1.1 一起使用,需要 v0.19 或更高版本
- jquery - Mediawiki 1.27.4 jquery 未加载
- pandas - 如何将函数应用于 Pandas 中的多个列
- vba - 带有 OFFSET 公式的 Excel #REF 错误
- python - 在 Tkinter 中使用两个图像的动画背景
- apache-kafka - kafka中如何识别和合并不同队列的消息
- html - 缩小时网站结构消失