TypeScript:联合类型中的通用类型推断

问题描述 投票:0回答:1

我正在尝试使用泛型和类型推断来键入 Typescript 函数。

这很好用:

const run= <TReturn>(param: { func: () => TReturn }): TReturn => {
    return param.func();
};

const result = run({ func: () => 1 }); // result: number

但是,将

param
设为联合类型会导致打字稿失效,并且无法推断出
TReturn

const run = <TReturn>(
    param: () => TReturn | { func: () => TReturn }
): TReturn => {
    return typeof param === 'object'
        ? (param as { func: () => TReturn }).func()
        : (param as () => TReturn)();
};

const result1 = run(() => 1); // result1: number
const result2 = run({ func: () => 1 }); // Errors!
// Errors:
// Argument of type '{ run: () => number; }' is not assignable to parameter of type '() => unknown'.
// Object literal may only specify known properties, and 'run' does not exist in type '() => unknown'.ts(2345)

我知道我可以使用函数重载来做到这一点。

这可以在没有函数重载的情况下实现吗?如果是,如何?

typescript typescript-generics type-inference
1个回答
0
投票

这会起作用。请注意联合中第一个类型周围添加的括号。

const run = <T>(
    param:  (() => T) | { func: () => T }
) => {
    if (typeof param === 'function') {
        return param()
    }
    return param.func()
};

const result1 = run(() => 1); // result1: number
const result2 = run({ func: () => 1 }); 
© www.soinside.com 2019 - 2024. All rights reserved.