繁体   English   中英

Select 基于 TypeScript 中第一个参数的 function 重载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM