如何使用流量类型进行DeSammigation



我有简单的类型,as:

type A = { a: number }
type B = { b: string }

我有一些带有type的包装器,以实现歧义:

type HasType<T> = {
  node: T,
  type: 'a' | 'b',
}

我正在尝试制作一种factory方法,在其中使用以下内容会使这种不敏感性:

function onlyA(obj: A): A { return obj; }
function onlyB(obj: B): B { return obj; }

没有类型,factory可以看起来像:

function factory(obj) {
  if (obj.type === 'a') onlyA(obj.node)
  else onlyB(obj.node)
}

所以我尝试了一些事情,

  1. HasType结合:

    function factory(obj: HasType<A> | HasType<B>): void {
      if (obj.type === 'a') onlyA(obj.node)
      else onlyB(obj.node)
    }
    
  2. union 唯一与类型的访问其属性:

    function factory2(obj: A | B): void {
      if (obj.a) onlyA(obj)
      else onlyB(obj)
    }
    
  3. union 仅使用类型,并验证属性存在:

    function factory3(obj: A | B): void {
      if ('a' in obj) onlyA(obj)
      else onlyB(obj)
    }
    

不幸的是,它们没有起作用,可以在这里找到示例。

我想念什么吗?我们可以以不同的方式实现这一目标吗?

@zerkms指出的解决方案是在每种类型中具有特定值的共同属性,例如:

type A = { a: number, type: "a" }
type B = { b: string, type: "b" }
function onlyA(obj: A): A { return obj; }
function onlyB(obj: B): B { return obj; }
function factory(obj: A | B): void {
  if (obj.type === 'a') onlyA(obj)
  else onlyB(obj)
}

这可以在此处进行测试

最新更新