我想通过ts声明一个带有两种类型的变量。但编译器提示错误。 像这样:
interface IAnyPropObject {
[name: string]: any;
}
let a: IAnyPropObject | ((str: string) => any);
a.B = "bbbbbbbb";//tips error
a("");//tips error

注意:我不想使用任何'声明。我只想通过这种方式约束变量。因为代码太旧而且它们不是TS代码。
答案 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类型的简要说明。
联盟:this
或that
类型,但不是两者。
interface A { [name: string]: any; }
interface B { (str: string): string; }
type UnionType = A | B;
Mixin:同时混合this
和that
类型。
interface A { [name: string]: any; }
interface B { (str: string): string; }
type MixinType = A & B;
如果您使用Mixin类型,那么您的代码将起作用,如果这是您的意图。变量a
可以同时混合使用两种类型。