[英]Determine the return type based upon the argument of a function in TypeScript
[英]Select a function overload based upon the first argument in TypeScript
我想创建一个 function f
,它接受Box<T>
作为它的第一个参数,第二个T
类型的参数是可选的,如果(且仅当!) T extends null
。
以下是f
的调用方式:
let _ = new Box(null)
let o = new Box({})
f(_, null) // ✅
f(o, {}) // ✅
f(_) // ✅
f(o) // ❌ (should not compile)
这就是我(试图)定义f
的方式:
class Box<V = any> {
constructor(public v: V) {}
}
type _ = null
type O = object
function f<V extends _>(b: Box<V>, v?: V): void
function f<V extends O>(b: Box<V>, v: V): void
function f(b: Box, v?: any) {}
乍一看这似乎有效。 但是有一个问题! f(o)
的错误报告如下:
Argument of type 'Box<{}>' is not assignable to parameter of type 'Box<null>'.
当我希望f
的用户实际看到的错误是:
Expected 2 arguments, but got 1.
似乎 TypeScript 优先选择第二个参数可选的重载。 当T
不扩展 null 时,如何使 select 成为另一个重载? 或者以其他方式实现我的目标?
如果您在 rest 参数中使用条件类型来基本上更改基于V
的最后一个参数的可选性,则可以获得所需的错误:
function f<V>(b: Box<V>, ...a: V extends null ? [v?: V]: [v:V]): void
function f(b: Box, v?: any) {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.