我有简单的类型,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)
}
所以我尝试了一些事情,
与
HasType
结合:function factory(obj: HasType<A> | HasType<B>): void { if (obj.type === 'a') onlyA(obj.node) else onlyB(obj.node) }
union 唯一与类型的访问其属性:
function factory2(obj: A | B): void { if (obj.a) onlyA(obj) else onlyB(obj) }
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)
}
这可以在此处进行测试