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
答案 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
(或更改函数的签名)时,你告诉编译器你知道你在做什么以及它没问题。