Eri*_*ric 9 duck-typing strong-typing typescript
TypeScript使用编译时(静态)duck typing.
我喜欢扩展原始类型以防止不正确的替换.例如,我喜欢给信用卡号码变量一个信用卡号码类型,而不是整数.我最近尝试使用一对扩展String的接口在TypeScript中执行此操作,并发现它们可以自由地替换彼此(并且该字符串替代两者).
我真的很想得到编译时的标称输入.有任何想法吗?
我想出了一种增强打字能力的方法。我不太喜欢它。人们向每种类型添加一个特殊的字段或方法,这将使其与其他类型不兼容,从而被误认为是鸭子。
以下不允许用 Parrot 替换 Duck,因为 Duck 类有一个附加方法(因此 Parrot 无法输入鸭子类型)。麻雀和鹦鹉在鸭子打字中显然是可以替代的,因为鹦鹉能做的事情都是麻雀做不到的,反之亦然。当然,鸭子可以代替鹦鹉,因为如果它听起来像鹦鹉,那么它就是鹦鹉。
使用www.typescriptlang.org/Playground/进行测试:
class Sparrow {
sound = "cheep";
}
class Parrot {
sound = "squawk";
}
class Duck {
sound = "quack";
swim(){
alert("Going for a dip!");
}
}
var parrot: Parrot = new Sparrow(); // substitutes
var sparrow: Sparrow = new Parrot(); // substitutes
var parrotTwo: Parrot = new Duck();
var duck: Duck = new Parrot(); // IDE & compiler error
alert("Parrot says "+parrot.sound+" and sparrow says "+sparrow.sound+", and 2nd parrot says "+parrotTwo.sound);
alert("A duck says "+duck.sound);
Run Code Online (Sandbox Code Playgroud)
更实际的是,我会这样做(这在我的 IDE 中有效,但在 Playground 中无效):
interface RawUri extends String {
rawUri;
}
interface EncodedUri extends String {
encodedUri;
}
var e: EncodedUri = new RawUri(); // IDE & compiler error
var r: RawUri = new EncodedUri(); // IDE & compiler error
Run Code Online (Sandbox Code Playgroud)
令人反感,并且有机会让另一个界面意外地使用相同的字段名称。我想人们可以向反鸭子成员添加一个随机元素。
归档时间: |
|
查看次数: |
2833 次 |
最近记录: |