泛型类型与map的函数参数一起使用,但不是单值

时间:2017-09-10 10:16:38

标签: typescript

interface DataGeneric {
    value: number;
}

function transform<D extends DataGeneric>(data: DataGeneric[], get_value: (record: D) => number) {

    // Works without error
    let values = data.map(get_value);
    // Following line errors with:
    //    Argument of type 'DataGeneric' is not assignable to parameter of type 'D'.
    //
    values = data.map(d => get_value(d));
    // Works without error, but why us type assertion needed?
    values = data.map(d => get_value(d as D));
}

我想知道为什么在将单个值传递给get_value时需要类型断言?

打字稿2.3.4

2 个答案:

答案 0 :(得分:1)

您可以通过将函数签名更改为:

来删除类型断言
function transform<D extends DataGeneric>(data: D[], get_value: (record: D) => number) {

答案 1 :(得分:1)

您需要转换为D或收到错误的原因:

  

类型&#39; DataGeneric&#39;的论证不能分配给类型的参数   &#39; d&#39;

这是:

interface DataGeneric2 extends DataGeneric {
    value2: string;
}

transform([{ value: 3 }], (record: DataGeneric2) => {
    return record.value2.length;
});

在此示例中,作为get_value传递的函数需要获取DataGeneric2类型而不是DataGeneric的值。
这是编译器抱怨的错误:
类型&#39; DataGeneric&#39;的论证不能分配给&#39; DataGeneric2&#39;。

类型的参数

当你把它强制转换为D(或更改函数的签名)时,你告诉编译器你知道你在做什么以及它没问题。