Javascript 具有依赖类型的Typescript并集

Javascript 具有依赖类型的Typescript并集,javascript,typescript,Javascript,Typescript,如果我有下面的并集,它封装了一个函数和它的参数,我怎么能调用它呢 type Wrapper = { fn: (a: string) => void arg: string } | { fn: (a: number) => void arg: number } let foo!: Wrapper foo.fn(foo.arg) // Error Type 'string' is not assignable to type 'never'. 我不知道怎么称呼它。我尝

如果我有下面的并集,它封装了一个函数和它的参数,我怎么能调用它呢

type Wrapper = {
  fn: (a: string) => void
  arg: string
} | {
  fn: (a: number) => void
  arg: number
}

let foo!: Wrapper
foo.fn(foo.arg) // Error Type 'string' is not assignable to type 'never'.
我不知道怎么称呼它。我尝试过的每件事基本上都可以归结为一种铸造(例如铸造到
(a:any)=>void
),如果我必须这样做,我可以这样做,但我觉得我不应该这样做

可以不强制转换调用此函数吗


编辑:为了澄清,我询问是否存在不涉及更改
包装定义的解决方案

不完全确定您的用例,但通过使用以下方法可以实现上述目的:


类型ArgType=number |字符串
类型包装={
fn:(a:T)=>void
arg:T
}
让福来包装纸
foo.fn(foo.arg)
让我们一起来!:包装纸
foo1.fn(foo1.arg)

谢谢您的尝试。我的例子被简化了。我在寻找一个一般情况下的答案,当我们不能以这种方式将联合体移出时。问题是,给定
typef=(x:A)=>t
typeg=(x:B)=>U
,联合体
typeh=F | G
(x:A&B)=>t | U
。要调用
H
类型的函数,我们需要提供一个参数,该参数是
a
B
@AluanHaddad的子类型是的,这似乎是typescript的逻辑,但它显然丢失了类型信息。我想知道是否有办法不丢失关于<代码> fn>代码>和<代码> ARG之间的关系的信息。你必须引入一个判别式,即。