在浏览 @ng-bootstrap
的一些打字稿代码时,我发现了 pipe(|
) 运算符。
export declare const NGB_PRECOMPILE: (typeof NgbAlert | typeof NgbTooltipWindow)[];
打字稿中管道(|
)运算符的用途是什么?
这在打字稿中称为 union type。
联合类型描述的值可以是多种类型之一。
管道 (|
) 用于分隔每种类型,例如 number | string | boolean
是可以是 number
、string
或 boolean
的值的类型。
let something: number | string | boolean;
something = 1; // ok
something = '1'; // ok
something = true; // ok
something = {}; // Error: Type '{}' is not assignable to type 'string | number | boolean'
这是一个类似于问题中的示例:
class Test1 {
public a: string
}
class Test2 {
public b: string
}
class Test3 {
}
let x: (typeof Test1 | typeof Test2)[];
x = [Test1]; //ok
x = [Test1, Test2]; //ok
x = [Test3]; //compilation error
x
是一个数组,其中包含 Test1
或 Test2
的构造函数。
管道代表“或”。因此,在这种情况下,它表示允许任何一种声明的类型。也许很容易理解原始类型的联合:
let x: (string | number);
x = 1; //ok
x = 'myString'; //ok
x = true; //compilation error for a boolean
thing: One | Two
两种类型都是具有不同属性的接口,它将合并(联合?)它们,并抱怨两者都不匹配彼此的属性。这不适用于原语,因为我不能只将对象与 boolean
或其他东西合并
每当我们在参数上使用 OR 运算符时,这就是该操作在幕后发生的事情,以限制我们可以实际引用的不匹配属性的数量。所以任何时候我们使用这个或操作符类型的脚本都会看看这两种不同的类型,它会说你只能引用那个参数上的属性,如果它们同时存在于这两种不同的类型中。
class Test1 {
public a: string|undefined;
public b: string|undefined
}
class Test2 {
public b: string|undefined
}
let x: Test1 | Test2 ;
x= new Test1();
x.a //compilation error :Property 'a' does not exist on type 'Test1 | Test2'. Property 'a' does not exist on type 'Test2'.
x.b //ok
x= new Test2();
x.a //compilation error :Property 'a' does not exist on type 'Test2'..
x.b // ok
something
,我如何知道它当前拥有的 特定类型 对象?我希望这个答案也能回答这个问题。typeof
,对于类instanceof
。或者它可以是用户定义的类型保护。视具体情况而定。更多信息在这里typescriptlang.org/docs/handbook/…