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

时间:2014-03-26 23:02:06

标签: typescript strong-typing duck-typing

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

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

我真的很想得到编译时的标称输入。有什么想法吗?

2 个答案:

答案 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