如何通过打字稿声明具有两种类型的变量

Fre*_*ars 14 javascript typescript

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

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

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

Eyu*_*lDK 24

Mixin 与 Union 类型的简要说明。

联合:要么thisthat类型,但不是两者兼而有之。

interface A { [name: string]: any; }
interface B { (str: string): string; }
type UnionType = A | B;
Run Code Online (Sandbox Code Playgroud)

Mixin:同时混合thisthat类型。

interface A { [name: string]: any; }
interface B { (str: string): string; }
type MixinType = A & B;
Run Code Online (Sandbox Code Playgroud)

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


Jua*_*des 6

如果您使用 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';
}
Run Code Online (Sandbox Code Playgroud)

您还可以创建一个自定义类型保护,我链接到的文档中对此进行了解释,那么您就不必强制转换它。还有很多要说的,因为我是通过手机接听的,所以我只是触及了表面,请阅读文档以了解所有详细信息。