gpt4 book ai didi

javascript - 如何消除流类型的歧义

转载 作者:行者123 更新时间:2023-12-03 00:07:57 26 4
gpt4 key购买 nike

我有简单的类型,如:

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

为了避免歧义,我有一些带有 type 的包装器:

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

我正在尝试创建一个工厂方法,它将消除使用以下内容的歧义:

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

如果没有类型,工厂可能如下所示:

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. 与类型联合,并访问它们的属性:

    function factory2(obj: A | B): void {
    if (obj.a) onlyA(obj)
    else onlyB(obj)
    }
  3. 与类型联合,并验证属性是否存在:

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

不幸的是,它们不起作用,示例可以找到 here .

我错过了什么吗?我们可以通过不同的方式实现这一目标吗?

最佳答案

正如 @zerkms 指出的,解决方案是在每种类型中拥有公共(public)属性和特定值,如下所示:

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)
}

这个可以测试here

关于javascript - 如何消除流类型的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54875506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com