Typescript:与先前参数的解析类型相同的泛型类型

2023-12-10

我想知道,当类型可以是多种类型时,如果与前一个参数的解析类型相同,如何指定该泛型类型。

TypeScript 游乐场

function add<T extends (number | string)>(a: T, b: T): T {
    if (typeof a === 'string') {
        return a + b;
    } else if (typeof a === 'number') {
        return a + b;
    }
}

add('hello', ' world');
add(1, 1);

我希望能够告诉编译器所有T类型相同,可以是数字,也可以是字符串。我可能错过了一些语法。条件类型可能(在某种程度上)......


您无法缩小函数内泛型参数的类型。所以当你测试时a这不会告诉编译器什么类型b是。更重要的是,它不会告诉编译器函数的返回类型需要是什么

function add<T extends (number | string)>(a: T, b: T): T {
    if (typeof a === 'string' && typeof b === 'string') {
        let result = a + b; // result is string, we can apply + 
        return result as T; // still an error without the assertion, string is not T 
    } else if (typeof a === 'number' && typeof b === 'number') {
        let result = a + b; // result is number, we can apply +
        return result as T; // still an error without the assertion, number is not T  
    }
    throw "Unsupported parameter type combination"; // default case should not be reached
}

在这种情况下,尽管可能有一个适用于联合的专用实现签名(意味着不需要断言),并且公共签名是您之前使用的签名:

function add<T extends number | string>(a: T, b: T): T
function add(a: number | string, b: number | string): number | string {
    if (typeof a === 'string' && typeof b === 'string') {
        return a + b;
    } else if (typeof a === 'number' && typeof b === 'number') {
        return a + b;
    }
    throw "Unsupported parameter type combination"; // default case should not be reached
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript:与先前参数的解析类型相同的泛型类型 的相关文章

随机推荐