打字稿:除了我们可以访问所有类型的联合并不常见的属性之外,是否有类似联合类型的东西?

时间:2017-01-29 23:33:58

标签: javascript typescript types properties union-types

"如果我们有一个具有联合类型的值,我们只能访问联合中所有类型共有的成员"

https://www.typescriptlang.org/docs/handbook/advanced-types.html

我正在寻找一种方法来使用可以是多种类型中的任何一种的动态变量,并通过它来访问其中一种类型的属性,这些类型对于所有其他类型都不常见。联盟

edited example

1 个答案:

答案 0 :(得分:2)

将类型保护与联合类型结合使用。

以下Foo | Bar联合类型可以是任何一种类型。通过使用类型保护,我们可以访问Foo不常见的属性Bar

class Foo
{
    public DoFoo = () => document.write("Foo");

    public Shared = () => document.write("FooShared");
}

class Bar
{ 
    public DoBar = () => document.write("Bar");

    public Shared = () => document.write("BarShared");
}

function isFoo(obj: Foo | Bar): obj is Foo { 
    return obj instanceof Foo;
}

let foobar: Foo | Bar = new Foo();

foobar.Shared(); // FooShared

if (isFoo(foobar)) {
    foobar.DoFoo(); // Foo
}

我们可以paste it here to play with it

在回答你的评论时,如果变量没有实例化,而是传递给函数,情况如下:

function SomeFunction(foobar: Foo | Bar)
{ 
    foobar.Shared(); // FooShared

    if (isFoo(foobar)) {
        foobar.DoFoo(); // Foo
    }   
}