Typescript继承了接口和文字字符串类型键错误

时间:2016-12-21 16:27:13

标签: typescript typescript2.1

我有3个接口(ABC),这些接口都来自公共接口(下面的Common)。我还有一个容器类型,包含这3个接口的数组(下面是Container)。

我想抓取其中一个数组并从对象中获取一个公共属性,如getCommon()所示:

interface Common {
    common: boolean;
}

interface A extends Common {
    a: A[];
}

interface B extends Common {
    b: B[];
}

interface C extends Common {
    c: C[];
}

type Container = {
    a: A[],
    b: B[],
    c: C[]
};

let item: Container = {
    a: [ { a: [], common: true } ],
    b: [ { b: [], common: true } ],
    c: [ { c: [], common: true } ]
};

type Key = 'a' | 'b' | 'c';

function getCommon (thisKey: Key) {
    return item[thisKey].map(a => a.common); // This line has an error
}

Typescript Playground link

然而,Typescript 2.1给了我一个编译错误:

Cannot invoke an expression whose type lacks a call signature. 
Type '{ <U>(this: [A, A, A, A, A], callbackfn: (value: A, index: number, array: A[]) => U, 
thisArg?: an...' has no compatible call signatures.

这是打字稿中的错误/限制,还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

似乎是一种限制。但是你可以通过给它编译类型来帮助编译器:(A | B | C)[]

function getCommon(thisKey: Key) {
    let arr: (A | B | C)[] = item[thisKey];
    return arr.map(a => a.common);
}