TypeScript使用编译时间(静态)duck typing。
我喜欢扩展原始类型以防止错误的替换。例如,我喜欢给信用卡号码变量一个信用卡号码类型,而不是整数。我最近尝试使用一对扩展String的接口在TypeScript中执行此操作,并发现它们可以自由地替换彼此(并且该字符串替代两者)。
我真的很想得到编译时的标称输入。有什么想法吗?
答案 0 :(得分: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);
更实际的是,我会这样做(在我的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
令人不快,并且有机会让另一个界面意外地使用相同的字段名称。我想可以在反鸭成员中添加一个随机元素。
答案 1 :(得分:0)
请考虑以下问题:
Atomic type discrimination (nominal atomic types) in TypeScript
例如:
export type Kilos<T> = T & { readonly discriminator: unique symbol };
export type Pounds<T> = T & { readonly discriminator: unique symbol };
export interface MetricWeight {
value: Kilos<number>
}
export interface ImperialWeight {
value: Pounds<number>
}
const wm: MetricWeight = { value: 0 as Kilos<number> }
const wi: ImperialWeight = { value: 0 as Pounds<number> }
wm.value = wi.value; // Gives compiler error
wi.value = wi.value * 2; // Gives compiler error
wm.value = wi.value * 2; // Gives compiler error
const we: MetricWeight = { value: 0 } // Gives compiler error