【发布时间】:2020-05-27 21:38:48
【问题描述】:
我想根据参数的给定类型来依赖条件,但由于所有可能的参数都是相同的二进制类型(数字),我寻找一种方法来创建某种类型的别名,可以检查为了。
这是最初的想法,这是行不通的,因为 typescript 被编译成 javascript,因此 bonus 将始终是 javascript 类型 number。
type Percentage = number;
class Foo {
applyBonus(bonus: Percentage | number) {
if (typeof bonus === 'Percentage') {
console.log('Percent');
} else {
// it's always number, because at execution time we're in javascript land here
console.log('number');
}
}
}
let bar = new Foo();
bar.applyBonus(5);
bar.applyBonus(6 as Percentage);
这个问题主要关注打字稿语言的可能性,以及是否可以通过打字稿特性来解决。可以很容易地使用像{value:6,type:'percent'} 这样的对象而不是二进制类型编号。
【问题讨论】:
-
没有运行时检查就无法做到这一点,但您可能会发现这个库很有趣:github.com/gcanti/money-ts。
-
TypeScript 使用structural type system,这意味着
number和Percentage代表完全相同的东西。某些语言使用nominal type system,这将允许您描述的内容,但在 TypeScript 中无法区分两个数字(或任何其他结构上等效的)类型。
标签: typescript design-patterns language-features type-alias