我正在尝试使函数返回基于参数值的条件类型,但参数的默认值是:
function myFunc<T extends boolean>(myBoolean: T = true): T extends true
? string
: number {
return myBoolean ? 'string' : 1
}
这会引发错误Type 'true' is not assignable to type 'T'.
'true' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'boolean'.
我不理解此错误,因为T
是布尔值,为什么我不能为其分配true
?
我尝试了另一种具有函数重载的方法:
function myFunc(myBool: true): string
function myFunc(myBool: false): number
function myFunc(myBool = true) {
return myBool ? 'string' : 1
}
myFunc()
但是现在打字稿不会让我不带参数调用myFunc()
(即使它具有默认值),并且第一个重载有错误This overload signature is not compatible with its implementation signature.
是否有可能做我在打字稿中想要实现的目标,如果儿子该怎么办?
答案 0 :(得分:1)
您的重载方法应该起作用。您可以将参数设置为true
重载的可选参数:
function myFunc(myBool?: true): string
function myFunc(myBool: false): number
function myFunc(myBool = true): string | number {
return myBool ? 'string' : 1
}
myFunc()
答案 1 :(得分:1)
T不是boolean
,它是boolean
的子类型。
考虑一个更一般的示例:
type T0 = { foo: string; };
declare function useFoo<T extends foo>(arg: T = { foo: 'bar' });
这也将失败,因为有效的T也可以是{ foo: string; bar: number; }
(T0
的子类型),默认参数不能分配给该值。
因此,默认参数和泛型通常不相辅相成,因此您可能最好选择重载,例如Titian's answer。