8
TypeScript使用编译时间(静态)duck typing。TypeScript鸭子打字,想要强力静态打字
我很喜欢扩展原始类型以防止错误的替换。例如,我喜欢给一个信用卡号码变量一个信用卡号码类型,而不是整数。我最近尝试在TypeScript中使用一对扩展String的接口来实现这一点,并发现它们可以自由地替换为另一个(并且该字符串替代两者)。
我真的很想得到编译时的名义打字。有任何想法吗?
TypeScript使用编译时间(静态)duck typing。TypeScript鸭子打字,想要强力静态打字
我很喜欢扩展原始类型以防止错误的替换。例如,我喜欢给一个信用卡号码变量一个信用卡号码类型,而不是整数。我最近尝试在TypeScript中使用一对扩展String的接口来实现这一点,并发现它们可以自由地替换为另一个(并且该字符串替代两者)。
我真的很想得到编译时的名义打字。有任何想法吗?
我想出了一种强化打字的方法。我不喜欢它。每种类型都会添加一个特殊的字段或方法,以使其与其他会混淆为鸭子的其他类型不兼容。
以下不允许将鸭子替换为鸭子,因为鸭子类有一个额外的方法(所以派诺特无法鸭子打字)。麻雀和鹦鹉在鸭子打字中显然是可以替代的,因为鹦鹉可以做到麻雀不能做到的东西,反之亦然。当然,鸭子可以替代鹦鹉,因为如果听起来像鹦鹉,它就是鹦鹉。
测试与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
令人反感的,而对于其它接口的机会意外地使用相同的字段名称。我想可以在反鸭会员中添加一个随机元素。
你是指名义打字? TypeScript的类型系统是静态的,并且JavaScript的运行时语义从根本上来说很弱,这与强类型系统相冲突。 –
是的,名义打字是我需要的术语。编辑参考上面的强打字。谢谢! – Eric
可能的重复[有没有一种方法可以在TypeScript中创建扩展原始类型的名义类型?](http://stackoverflow.com/questions/26810574/is-there-a-way-to-create-nominal-types- in-typescript-that-extend-primitive-types) –