Búsqueda de sitios web

javascript - cómo declarar una variable con dos tipos mediante typescript


Quiero declarar una variable con dos tipos vía ts. Pero el compilador muestra un error. Así:

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

nota: No quiero usar 'any' para declarar. Solo quiero restringir la variable de esta manera. Porque el código es tan antiguo y no es código TS.

Respuesta #1

Explicación breve de los tipos Mixin frente a los tipos Union.

Unión: Ya sea del tipo this o del tipo that, pero no ambos.

interface A { [name: string]: any; }
interface B { (str: string): string; }
type UnionType = A | B;

Mixin: Una mezcla de esto y aquello al mismo tiempo.

interface A { [name: string]: any; }
interface B { (str: string): string; }
type MixinType = A & B;

Tu código funcionaría si usas un tipo Mixin, si esa es tu intención. La variable a puede tener una mezcla de ambos tipos al mismo tiempo.

Respuesta #2

Si usas un tipo OR, eso no significa que tu objeto tenga dos tipos al mismo tiempo, tienes que probarlo y usar el tipo correcto con casting dentro de la prueba.

Ver 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';
}

También podrías crear un guardia de tipo personalizado, está explicado en la documentación que enlacé, entonces no tendrías que hacer un casting. Hay mucho más por decir, solo he arañado la superficie ya que estoy respondiendo desde mi teléfono, lee la documentación para todos los detalles.

Artículos relacionados