TypeScript接口的允许名称

时间:2014-03-09 23:16:10

标签: typescript

考虑一下编译好的代码:

interface Whatever {
    name: string;
}

var x : Whatever = {
    name: "Whatever"
};

将“Whatever”更改为“Map”并获得此代码:

interface Map {
    name: string;
}

var x : Map = {
    name: "Whatever"
};

当我使用tsc(在最新的Ubuntu上从npm安装)编译时,我得到了这个令人讨厌的输出:

test.ts(1,11): error TS2234: All declarations of an interface must have identical type parameters.
test.ts(5,5): error TS2012: Cannot convert '{ name: string; }' to 'Map<any, any>':
    Type '{ name: string; }' is missing property 'clear' from type 'Map<any, any>'.
test.ts(5,9): error TS2173: Generic type references must include all type arguments.

我是TypeScript的新手,所以我不确定这意味着什么。我猜有些东西默认已经命名为Map,也许?有谁知道发生了什么?是否有一些关于我可以命名我的界面的限制的明确列表?

1 个答案:

答案 0 :(得分:2)

您遇到的是为大量ECMAScript 6功能预定义的接口,包括MapMap规范的解释为here:< / p>

// lib.t.ts
//
/////////////////////////////
/// IE11 ECMAScript Extensions
/////////////////////////////
interface Map<K, V> {
    clear(): void;
    delete(key: K): boolean;
    forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;
    get(key: K): V;
    has(key: K): boolean;
    set(key: K, value: V): Map<K, V>;
    size: number;
}
declare var Map: {
    new <K, V>(): Map<K, V>;
}

因此,您刚刚遇到已在全局命名空间中定义的类型。如果需要,可以添加module以允许您使用导出的界面而不会出现问题。

module Special {
    export interface Map {
        name: string;
    }
}