javascript - una - title html
Flujo: crea un tipo de flujo extendiendo otro tipo (1)
type someType = {
keyOne: string,
keyTwo: string,
};
type someOtherType = {
keyOne: string,
keyTwo: string,
keyThree: string,
};
Ambos tipos son objetos que contienen keyOne
y keyTwo
, la única diferencia es que este último amplía el primero con una clave adicional de keyThree
.
En lugar de escribir código duplicado, ¿es posible construir el tipo de flujo someType
extendiendo someType
? En mi opinión, me viene a la mente el descanso / dispersión de objeto ES6, pero no estoy seguro de cómo lograr algo como esto en Flow.
¡Gracias!
Lo que estás buscando es el tipo de intersección . De acuerdo con la documentación:
Un tipo de intersección requiere un valor para todos los tipos de entrada.
Sintaxis: Intersección: <tipo 1> & <tipo 2> ... & <tipo n>
El tipo de intersección está destinado a extender un tipo existente y agregarle requisitos de tipo adicionales.
type someType = {
keyOne: string,
keyTwo: string
}
type someOtherType = someType & {
keyThree: string
}
const shouldBeOk: someOtherType = {
keyOne: ''biz'',
keyTwo: ''buzz'',
keyThree: ''baz'',
}
const shouldError: someOtherType = {
keyOne: 123,
keyTwo: ''hello'',
keyThree: ''world'',
}
// flow error:
16: const shouldError: someOtherType = {
^ object literal. This type is incompatible with
8: type someOtherType = someType & {
^ object type
El opuesto lógico del tipo de intersección es el tipo de unión . De acuerdo con la documentación:
Un tipo de unión requiere que un valor sea uno de los tipos de entrada.
Sintaxis: Unión: <tipo 1> | <tipo 2> ... | <tipo n>
Como ejemplo. puede usar el tipo de unión para crear un enumerable.
type fooBarBazType = ''foo'' | ''bar'' | ''baz'';
const shouldBeOk: fooBarBazType = ''bar'';
const shouldError: fooBarBazType = ''buzz'';
4: const shouldError: fooBarBazType = ''buzz'';
^ string. This type is incompatible with
4: const shouldError: fooBarBazType = ''buzz'';
^ string enum