如何在Typescript中模拟隐式参数?

时间:2019-09-22 23:15:04

标签: typescript

我发现Scala中的隐式参数非常有用,我想在Typescript中具有等效的功能。让我举个例子:

interface Witness<T> {
  describe(t: T): void;
}

class X {
  foo<T>(t: T, witness: Witness<T>) {
    witness.describe(t);
  }
}

const stringWitness: Witness<string> = {
    describe(a: string): void {
      console.log(`The string, in all caps: ${a.toUpperCase()}`);
    }
}

const numberWitness: Witness<number> = {
    describe(b: number): void {
      console.log(`the number, plus one: ${b+1}`);
    }
}

class X {
  foo<T>(t: T, witness: Witness<T>) {
    witness.describe(t);
  }
}

const x = new X();    
x.foo( "Bob", stringWitness);
x.foo(5, numberWitness);

此代码将编译并执行您期望的操作。更重要的是,x.foo("Bob", numberWitness)之类的错误不会编译。这种模式使我可以使用其他功能来扩展现有类型。

我想做的以及Scala隐式允许我做的是“自动”选择第二个参数:

class X {  
  foo<number>(t: number, witness = numberWitness);
  foo<string>(t: string, witness = stringWitness);
  foo<T>(t: T, witness: Witness<T>) {
    witness.describe(t);
  }
}

const x = new X();    
x.foo("Bob");
x.foo(5);

此代码的唯一问题是它不能在Typescript中编译。

考虑到其他参数的类型,我正在寻找一种在某些情况下指定默认参数的方法。有什么建议吗?

注意::我正在寻找一种指定默认参数的方法。我没有在示例中寻找解决问题的替代方法,例如运行时检测。那只是一个例子。我有几种用法,这些用法太复杂了,无法在此处详细解释。

0 个答案:

没有答案