首页 > 解决方案 > TypeScript 在调用对象(这是一个函数)的值时无法推断出正确的类型

问题描述

const record = {
    foo: () => ({ foo: 1 }),
    bar: () => ({ bar: 1 }),
}

function getRecord<T extends keyof typeof record>(type: T) {
    return record[type];
}

const obj = getRecord(`foo`);
// if line 7 is:        return record[type];
// typeof obj will be:  () => { foo: number; }

// but if line 7 is:    return record[type]();
// typeof obj will be:  { foo: number; } | { bar: number; }
obj

游乐场链接

当没有调用返回值时,TypeScript 可以成功推断出返回类型为() => { foo: number },但是当调用返回值时,类型推断扩大到{ foo: number; } | { bar: number; }。为什么会这样?

标签: javascripttypescript

解决方案


返回类型:

function getRecord<T extends keyof typeof record>(type: T) {
    return record[type];
}

(typeof record)[T]。如您所见,泛型类型参数会在调用函数时影响函数的返回类型。


在第二个例子中:

function getRecord<T extends keyof typeof record>(type: T) {
    return record[type]();
}

返回类型是{ foo: number } | { bar: number }. 这里泛型参数不影响它(已经用于预评估返回类型)。


推荐阅读