【发布时间】:2018-12-28 03:37:05
【问题描述】:
如何在不使用重载签名的情况下改用条件类型来重写它?
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'.
【问题讨论】:
-
看起来这是一个known issue,他们在那个问题中提到
any强制转换或重载是当前的解决方法。此外,在他们的June Design Meeting Notes 中,他们提到:今天,一个类型不能分配给一个条件类型,除非它是另一个条件类型。,所以他们似乎意识到了这一点,并且可能会进行修复未来。 -
@CRice 谢谢!在问我的问题之前,我花了很长时间试图找到一个相应的问题,但它隐藏得太好了。
标签: typescript typescript-generics conditional-types