typescript - 如何在 Typescript 中输入检查二进制类型别名

标签 typescript design-patterns language-features type-alias

我想依赖给定参数类型的条件,但由于所有可能的参数都是相同的二进制类型(数字),我寻找一种方法来创建某种可以检查的类型别名为了。

这是最初的想法,但行不通,因为 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 })

Playground


或者(我不推荐这样做,但在学术上很有趣),您可以子类化 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/

相关文章:

angular - Angular 编译器要求 TypeScript >=2.7.2 和 <2.8.0,但找到了 2.8.3

java - 模型类(在 MVC 中)应该使用静态方法还是实例方法?

c++ - 状态设计模式-编译错误

TypeScript:接口(interface)方法实现

javascript - NestJS TypeORM 导入解决方案

c# - 什么时候使用工厂方法模式?

javascript - 有什么方法可以通过属性访问函数的返回值吗?

programming-languages - 语言必须具备哪些功能?

Scala 将隐式转换优先于 "natural"操作......为什么?这是一个错误吗?还是我做错了什么?

javascript - 使用 typescript 在类级别应用 scss 值