我想依赖给定参数类型的条件,但由于所有可能的参数都是相同的二进制类型(数字),我寻找一种方法来创建某种可以检查的类型别名为了。
这是最初的想法,但行不通,因为 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);
这个问题主要集中在 TypeScript 语言的可能性,以及是否可以通过 TypeScript 功能来解决。可以很容易地使用像 {value:6,type:'percent'}
这样的对象来代替二进制类型的数字。
最佳答案
Typescript 不是根据事物的名称来打字,而是根据事物的结构来打字。您可以将数字命名为其他名称,但它仍然是一个数字。 Percentage
这里只是一个别名。
执行此类操作的更好方法是创建一个具有独特形状的界面,您可以在运行时轻松识别该界面。
interface Percentage { percentage: number }
class Foo {
applyBonus(bonus: Percentage | number) {
if (typeof bonus === 'object') {
console.log('Percent', bonus.percentage);
} else {
console.log('number', bonus);
}
}
}
new Foo().applyBonus(123)
new Foo().applyBonus({ percentage: 456 })
或者(我不推荐这样做,但在学术上很有趣),您可以子类化 Number
并使用它。
class Percentage extends Number { }
class Foo {
applyBonus(bonus: Percentage | number) {
if (bonus instanceof Percentage) {
console.log('Percent', bonus);
} else {
console.log('number', bonus);
}
}
}
new Foo().applyBonus(123)
new Foo().applyBonus(new Percentage(456))
但说实话,我会质疑你对此的需求。我不确定您想在这里完成什么,但可能有一种更简单的方法。
关于typescript - 如何在 Typescript 中输入检查二进制类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62053314/