typescript 打字脚本如何缩小泛型?

zbdgwd5y  于 2023-06-30  发布在  TypeScript
关注(0)|答案(1)|浏览(116)

我写了下面的代码,但是返回值发生了错误

function test_fn<T> (arg: T): T extends string | number ? boolean : number
{
    if(typeof arg === "string" || typeof arg === "number")
    {
        return true
    }
    return 1
}

错误消息为:TS2322:类型“true”不可分配给类型“T extends string| number?boolean:数字'。

我觉得我的写作应该得到正确的类型推断,但它没有。我能做些什么来消除这种类型错误?

nzk0hqpo

nzk0hqpo1#

请检查下面的代码片段,它解决了上述问题。

declare const calc: (expr: string, options?: any) => any;

type StrOrNum = string | number;

type CalcWrapReturnType = StrOrNum | ((expr: StrOrNum) => StrOrNum) | null

function calc_wrap<T extends unknown>(expr_or_data: T, data?: any): CalcWrapReturnType {
    const _fill_data: any[] = [];
    const options = { _error: "_" };

    if(typeof expr_or_data === 'string') {
        return calc( expr_or_data, {
            _fill_data,
            ...options
        } ) as StrOrNum;
    }
 return typeof expr_or_data === 'string' ? ( expr: StrOrNum ): StrOrNum => calc( expr as string, _fill_data ) : null;
}

我的实现只是忽略了T的类型是否是数字。也许你可以把数字转换成一个字符串,并在需要时使用它。

相关问题