TypeScript Duck打字,想要强烈的静态打字

Eri*_*ric 9 duck-typing strong-typing typescript

TypeScript使用编译时(静态)duck typing.

我喜欢扩展原始类型以防止不正确的替换.例如,我喜欢给信用卡号码变量一个信用卡号码类型,而不是整数.我最近尝试使用一对扩展String的接口在TypeScript中执行此操作,并发现它们可以自由地替换彼此(并且该字符串替代两者).

我真的很想得到编译时的标称输入.有任何想法吗?

Eri*_*ric 4

我想出了一种增强打字能力的方法。我不太喜欢它。人们向每种类型添加一个特殊的字段或方法,这将使其与其他类型不兼容,从而被误认为是鸭子。

以下不允许用 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 次

最近记录:

6 年,3 月 前