如何通过typescript声明两种类型的变量

时间:2017-06-22 02:01:52

标签: javascript typescript

我想通过ts声明一个带有两种类型的变量。但编译器提示错误。 像这样:



interface IAnyPropObject { 
    [name: string]: any;
}
let a: IAnyPropObject | ((str: string) => any);
a.B = "bbbbbbbb";//tips error
a("");//tips error




注意:我不想使用任何'声明。我只想通过这种方式约束变量。因为代码太旧而且它们不是TS代码。

2 个答案:

答案 0 :(得分:4)

如果你使用OR类型,并不意味着你的对象同时有两种类型,你必须测试它并在测试中使用正确的类型。

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

interface IAnyPropObject { [name: string]: any; }
type MyFunc = (str: string) => any;
let a: IAnyPropObject | ((str: string) => any);
if (a instanceof Function) {
     (<MyFunc>a)("hi"); //passing a number will throw an error
} else {
    (<IAnyPropObject>a).b = 'bbbbbbbb';
}

你也可以创建一个自定义类型保护,它在我链接的文档中进行了解释,然后你就不必再进行转换了。还有更多要说的内容,因为我从手机接听电话,所以我只是在表面上看了一下,阅读了有关所有细节的文档。

答案 1 :(得分:2)

Mixin vs Union类型的简要说明。

联盟:thisthat类型,但不是两者。

interface A { [name: string]: any; }
interface B { (str: string): string; }
type UnionType = A | B;

Mixin:同时混合thisthat类型。

interface A { [name: string]: any; }
interface B { (str: string): string; }
type MixinType = A & B;

如果您使用Mixin类型,那么您的代码将起作用,如果这是您的意图。变量a可以同时混合使用两种类型。

相关问题