如何在不重载签名的情况下使用条件类型来重写它?
function foo(returnString: true): string;
function foo(returnString: false): number;
function foo(returnString: boolean) {
return returnString ? String(Math.random()) : Math.random();
}
我试过下面的代码,但如果没有as any
,它就无法编译:
function foo<T extends boolean>(returnString: T): T extends true ? string : number {
return (returnString ? String(Math.random()) : Math.random()) as any;
}
我怎样才能去掉as any
?
错误信息非常无用:
Type 'string | number' is not assignable to type 'T extends true ? string : number'.
Type 'string' is not assignable to type 'T extends true ? string : number'.
最佳答案
我不确定为什么编译器不能按原样接受它(对 TypeScript 不是很熟悉),但您可以这样做:
function foo<T extends boolean>(returnString: T): T extends true ? string : number;
function foo<T extends boolean>(returnString: T): string | number {
return returnString ? String(Math.random()) : Math.random();
}
基本上,您将声明(公共(public)签名)和实现分开,为声明提供更准确的签名,为实现提供更广泛的签名。
关于TypeScript:条件类型和使用 bool 参数来控制返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432121/