获取类型扩展名

时间:2018-04-29 14:53:23

标签: typescript

function extractIdFromObject<T extends { id: U }, U>(item: T) {
    return item.id;
}

const x = extractIdFromObject({ id: 1 });
const y = extractIdFromObject({ id: "1" });
const z = extractIdFromObject({ id: {} });

我编写了上面的函数,它给出了一个具有属性id的对象,它将返回id的值。

虽然以上操作会运行得很好,但TS引擎会将xyz推断为{}

为了获得Uitem.id)的正确类型信息,我如何更改类型?

1 个答案:

答案 0 :(得分:2)

使用Typescript来推断一个基于另一个类型参数的类型参数通常不起作用。在这种情况下,最简单的解决方案是使用类型查询。

function extractIdFromObject<T extends { id: any }>(item: T): T['id']{
    return item.id;
}

const x = extractIdFromObject({ id: 1 });

const y = extractIdFromObject({ id: "1" });
const z = extractIdFromObject({ id: {} });