我发现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中编译。
考虑到其他参数的类型,我正在寻找一种在某些情况下指定默认参数的方法。有什么建议吗?
注意::我正在寻找一种指定默认参数的方法。我没有在示例中寻找解决问题的替代方法,例如运行时检测。那只是一个例子。我有几种用法,这些用法太复杂了,无法在此处详细解释。