具有依赖类型的打字稿联合

时间:2020-09-21 14:54:15

标签: 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'.

我不知道怎么称呼它。我尝试过的所有内容基本上都归结为强制转换(例如强制转换为(a:any) => void),但我必须这样做,但是我觉得我不必这样做。

可以在不强制转换的情况下调用此函数吗?

编辑:为澄清起见,我要问是否存在不涉及更改Wrapper定义的解决方案。

1 个答案:

答案 0 :(得分:0)

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


type ArgType = number | string

type Wrapper<T extends ArgType> = {
  fn: (a: T) => void
  arg: T
}

let foo!: Wrapper<number>
foo.fn(foo.arg)

let foo1!: Wrapper<string>
foo1.fn(foo1.arg)