Type脚本使用编译时间(静态)duck typing
我喜欢扩展原语类型以防止不正确的替换。例如,我喜欢给信用卡号变量一个信用卡号类型,而不是整数。我最近尝试在typescript中使用一对扩展字符串的接口来实现这一点,发现它们可以自由地相互替换(字符串可以同时替换这两个接口)。
我真的很想得到编译时间名义打字。有什么想法吗?

最佳答案

我想出了一种增强打字能力的方法。我不太喜欢。一种方法在每种类型中添加一个特殊的字段或方法,这将使它与其他类型的字段或方法不兼容,而其他类型的字段或方法会被混淆为鸭子。
下面不允许用parrot替换duck,因为duck类有一个附加的方法(因此parrot无法进行duck键入)。麻雀和鹦鹉在鸭子打字中显然是可以替代的,因为鹦鹉不能做什么,麻雀不能,反之亦然。当然,鸭子可以代替鹦鹉,因为如果听起来像鹦鹉,那就是鹦鹉。
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);

更实际地说,我会这样做(在我的ide中有效,但在操场上无效):
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

令人讨厌的是,另一个接口意外使用同一个字段名的机会。我想可以给反duck成员添加一个随机元素。

07-24 14:58