ChatGPT解决这个技术问题 Extra ChatGPT

打字稿中的管道(|)是什么意思?

在浏览 @ng-bootstrap 的一些打字稿代码时,我发现了 pipe(|) 运算符。

export declare const NGB_PRECOMPILE: (typeof NgbAlert | typeof NgbTooltipWindow)[];

打字稿中管道(|)运算符的用途是什么?


A
Aleksey L.

这在打字稿中称为 union type

联合类型描述的值可以是多种类型之一。

管道 (|) 用于分隔每种类型,例如 number | string | boolean 是可以是 numberstringboolean 的值的类型。

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'

Playground

这是一个类似于问题中的示例:

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 的构造函数。


那么给定 something,我如何知道它当前拥有的 特定类型 对象?我希望这个答案也能回答这个问题。
@Nawaz 你可以使用类型保护。对于基元,它可以是 typeof,对于类 instanceof。或者它可以是用户定义的类型保护。视具体情况而定。更多信息在这里typescriptlang.org/docs/handbook/…
看起来该工会手册链接现在已弃用,并且“转到新页面”按钮没有任何用处。您可能希望将其更改为 this link
+1 -- TypeScript 支持代数数据类型。如果您来自 OOP 背景,这些对您来说可能是新的,并且可能非常强大。在高层次上,它们是支持组合而不是继承的语言特性。这使得表达不适合继承的模型变得非常容易。 “函数式编程中的域驱动设计”一书是个人最喜欢的示例书——我强烈推荐给任何使用 TS 或 F# 的人。
c
cham

管道代表“或”。因此,在这种情况下,它表示允许任何一种声明的类型。也许很容易理解原始类型的联合:

let x: (string | number);

x = 1; //ok
x = 'myString'; //ok
x = true; //compilation error for a boolean

在 JS 中双管道是逻辑 OR,单管道是按位运算符 OR。
此外,它似乎只适用于原语,因为 thing: One | Two 两种类型都是具有不同属性的接口,它将合并(联合?)它们,并抱怨两者都不匹配彼此的属性。这不适用于原语,因为我不能只将对象与 boolean 或其他东西合并
A
Apoorv

每当我们在参数上使用 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