2014-03-26 13 views
8

TypeScript使用编译时间(静态)duck typingTypeScript鸭子打字,想要强力静态打字

我很喜欢扩展原始类型以防止错误的替换。例如,我喜欢给一个信用卡号码变量一个信用卡号码类型,而不是整数。我最近尝试在TypeScript中使用一对扩展String的接口来实现这一点,并发现它们可以自由地替换为另一个(并且该字符串替代两者)。

我真的很想得到编译时的名义打字。有任何想法吗?

+1

你是指名义打字? TypeScript的类型系统是静态的,并且JavaScript的运行时语义从根本上来说很弱,这与强类型系统相冲突。 –

+0

是的,名义打字是我需要的术语。编辑参考上面的强打字。谢谢! – Eric

+0

可能的重复[有没有一种方法可以在TypeScript中创建扩展原始类型的名义类型?](http://stackoverflow.com/questions/26810574/is-there-a-way-to-create-nominal-types- in-typescript-that-extend-primitive-types) –

回答

3

我想出了一种强化打字的方法。我不喜欢它。每种类型都会添加一个特殊的字段或方法,以使其与其他会混淆为鸭子的其他类型不兼容。

以下不允许将鸭子替换为鸭子,因为鸭子类有一个额外的方法(所以派诺特无法鸭子打字)。麻雀和鹦鹉在鸭子打字中显然是可以替代的,因为鹦鹉可以做到麻雀不能做到的东西,反之亦然。当然,鸭子可以替代鹦鹉,因为如果听起来像鹦鹉,它就是鹦鹉。

测试与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 

令人反感的,而对于其它接口的机会意外地使用相同的字段名称。我想可以在反鸭会员中添加一个随机元素。