¿Qué significa la tubería (|) en mecanografiado?

84

Mientras navegaba por algún código mecanografiado de @ng-bootstrap, encontré el |operador pipe ( ).

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

¿Cuál es el uso del |operador pipe ( ) en mecanografiado?

Jobin
fuente

Respuestas:

103

Esto se llama tipo de unión en mecanografiado.

Un tipo de unión describe un valor que puede ser de varios tipos.

Pipe ( |) se usa para separar cada tipo, por ejemplo, number | string | booleanes el tipo de un valor que puede ser a number, a stringo a 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'

Patio de recreo


Y aquí hay un ejemplo similar al de la pregunta:

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

xes una matriz que contiene constructores de Test1 o Test2 .

Aleksey L.
fuente
Entonces something, ¿cómo sé qué tipo específico de objeto contiene actualmente? Desearía que esta respuesta también tratara de responder eso.
Nawaz
1
@Nawaz puedes usar guardias de tipo. En caso de primitivas puede serlo typeof, en caso de clases instanceof. O puede ser un tipo de protección definido por el usuario. Depende del caso específico. Más información aquí typescriptlang.org/docs/handbook/…
Aleksey L.
18

La tubería representa 'o'. Entonces, en este contexto, dice que cualquiera de los tipos declarados está permitido. Quizás sea fácil de entender una unión con tipos primitivos:

let x: (string | number);

x = 1; //ok
x = 'myString'; //ok
x = true; //compilation error for a boolean
cham
fuente
10
en JS, el conducto doble es un OR lógico, el conducto único es un operador bit a bit OR.
Kirill
2
Además, solo parece funcionar con primitivas, porque thing: One | Twocuando ambos tipos son una interfaz con propiedades diferentes, los fusionará (¿unirá?) Y se quejará de que ninguno de ellos coincide con las propiedades de los demás. Eso no funcionará con primitivas, porque no puedo simplemente fusionar un objeto con booleano algo así
TrySpace