返回类型随参数变化
如何让返回类型随参数类型变化?
- 普通函数: 使用函数重载;
function add1(param: number): number;
function add1(param: string): string;
function add1(param: string | number): string | number {
if (typeof param === "string") {
return param;
}
return param;
}
- 箭头函数: 用带调用签名的 interface 配合
as断言;
interface IAdd1 {
(param: number): number;
(param: string): string;
}
const add2 = ((param: string | number) => {
if (typeof param === "string") {
return param;
}
return param;
}) as IAdd1;
如何让返回类型随参数值变化?
- 普通函数: 同样用函数重载;
- 箭头函数: 同样用 interface +
as; - 两种函数通用: interface + 映射类型查表;
interface IAdd2 {
1: number;
2: string;
}
function sub<T extends keyof IAdd2>(param: T) {
return {
1: 3,
2: "",
}[param];
}
const a = sub(1); // number
const b = sub(2); // string
- 原理: 字面量实参被推断为字面量类型, 经
keyof约束后用索引访问取出对应值类型; - 适用: 返回类型由少量离散取值决定的工厂函数、查表函数;