Estoy tratando de encontrar una manera de pasar de un objeto a la función y comprobar que el tipo en tiempo de ejecución. Este es un pseudo código:

func(obj:any){
  if(typeof obj === "A"){
    //do something
  }
  else if(typeof obj === "B"{
    //do something else
  }

}
 a:A;
 b:B;
 func(a);

Pero typeof es siempre el retorno de «objeto» y no he podido encontrar una manera de conseguir el tipo real de «a» o «b». El instanceof no funciona bien y volver por el mismo.
Alguna idea de cómo hacerlo en un Manuscrito?

Gracias por su ayuda!!!

OriginalEl autor Eden1971 | 2017-05-19

4 Comentarios

  1. 25

    Editar: quiero señalar a la gente que viene aquí a partir de las búsquedas que esta es la pregunta que trata específicamente con los no-tipos de clase, es decir, objeto de
    las formas como se define por interface o type alias. Para la clase de tipos que
    puede utilizar JavaScript instanceof para determinar la clase una instancia viene, y los Manuscritos delimitar el tipo en el tipo de corrector automáticamente.

    Tipos son despojados en tiempo de compilación y no existen en tiempo de ejecución, por lo que no puede comprobar el tipo en tiempo de ejecución.

    Lo que puedes hacer es comprobar que la forma de un objeto es lo que esperaba, y los Manuscritos puede afirmar que el tipo en tiempo de compilación usando un tipo definido por el usuario de la guardia que devuelve true (anotado tipo de retorno es un «tipo de predicado» de la forma arg is T) si la forma coincide con sus expectativas:

    interface A {
      foo: string;
    }
    
    interface B {
      bar: number;
    }
    
    function isA(obj: any): obj is A {
      return obj.foo !== undefined 
    }
    
    function isB(obj: any): obj is B {
      return obj.bar !== undefined 
    }
    
    function func(obj: any) {
      if (isA(obj)) {
        //In this block 'obj' is narrowed to type 'A'
        obj.foo;
      }
      else if (isB(obj)) {
        //In this block 'obj' is narrowed to type 'B'
        obj.bar;
      }
    }

    Ejemplo en el Patio de recreo

    Lo profundo que tomar el tipo de la guardia de la aplicación es realmente depende de usted, sólo tiene que devolver verdadero o falso. Por ejemplo, como Carl señala en su respuesta, el ejemplo anterior sólo se comprueba que espera que las propiedades se definen (siguiendo el ejemplo en el google docs), no es que ellos son los que están asignados el tipo esperado. Esto puede ser difícil con tipos que aceptan valores null y objetos anidados, es hasta usted para determinar cómo detallada para hacer la forma de verificación.

    muchas gracias, es claro ahora!
    comprobar esto: aliolicode.com/2016/04/23/type-checking-typescript tenga en la orilla, ver esta línea también: la consola.registro(juan instanceof Persona); // true …saludos!
    Que sólo funciona con las instancias de una clase, y no de otros tipos (como las interfaces). OP mencionado instanceof no trabajo así que yo supongo que él no es la clase de instancia de objeto.
    Es posible que cuando el transporte de información de tipos en tiempo de ejecución de código. E. g. con un transformador personalizado en el TS > 2.4.

    OriginalEl autor Aaron Beall

  2. 4

    Ampliación de Aarón de la respuesta, he hecho un transformador que genera el tipo de funciones de vigilancia en tiempo de compilación. De esta manera usted no tiene que escribir manualmente.

    Por ejemplo:

    import { is } from 'typescript-is';
    
    interface A {
      foo: string;
    }
    
    interface B {
      bar: number;
    }
    
    if (is<A>(obj)) {
      //obj is narrowed to type A
    }
    
    if (is<B>(obj)) {
      //obj is narrowed to type B
    }

    Usted puede encontrar el proyecto aquí, con instrucciones de uso:

    https://github.com/woutervh-/typescript-is

    typescript-is no es bueno. ellos me obligan a usar ttypescript.
    en realidad usted no está obligado a utilizar ttypescript, usted puede también mediante programación de compilar el proyecto con el typescript API y configurar los transformadores de sí mismo. ttypescript es el recomendado en medio porque hace esto para usted. Cuando se utiliza un transformador que no tienen otra opción por el momento. Y lo que está mal con ttypescript de todos modos? 😉
    sí. estás en lo correcto. ttypescript es la forma recomendada y es una buena solución. Mi opinión es que quien no desea agregar otro compilador. Si utiliza typescript-is, se debe agregar otro compilador o escribir propia de compilación lógica. Se convertirá en otro complejidad.

    OriginalEl autor user7132587

  3. 0

    He estado jugando con la respuesta de Aarón, y creo que sería mejor para la prueba de typeof en lugar de sólo indefinido, como este:

    interface A {
      foo: string;
    }
    
    interface B {
      bar: number;
    }
    
    function isA(obj: any): obj is A {
      return typeof obj.foo === 'string' 
    }
    
    function isB(obj: any): obj is B {
      return typeof obj.bar === 'number' 
    }
    
    function func(obj: any) {
      if (isA(obj)) {
        console.log("A.foo:", obj.foo);
      }
      else if (isB(obj)) {
        console.log("B.bar:", obj.bar);
      }
      else {console.log("neither A nor B")}
    }
    
    const a: A = { foo: 567 }; //notice i am giving it a number, not a string 
    const b: B = { bar: 123 };
    
    func(a);  //neither A nor B
    func(b);  //B.bar: 123

    OriginalEl autor Carl Sorenson

  4. -1

    La OPs pregunta fue: «estoy tratando de encontrar una manera de pasar de un objeto a la función y comprobar que el tipo en tiempo de ejecución».

    Desde una instancia de una clase es simplemente un objeto, la respuesta correcta es utilizar una instancia de la clase y instanceof cuando la comprobación de tipos en tiempo de ejecución es necesario, utilice la interfaz cuando no.

    En mi codebase, yo normalmente tienen una clase que implementa una interfaz y la interfaz se utiliza durante la compilación para la pre-tiempo de compilación tipo de seguridad, mientras que las clases se utilizan para organizar mi código así como realizar operaciones de tipo en tiempo de ejecución comprueba en el manuscrito.

    Funciona porque routerEvent es una instancia de NavigationStart clase

    if (routerEvent instanceof NavigationStart) {
      this.loading = true;
    }
    
    if (routerEvent instanceof NavigationEnd ||
      routerEvent instanceof NavigationCancel ||
      routerEvent instanceof NavigationError) {
      this.loading = false;
    }

    No funcionará

    //Must use a class not an interface
    export interface IRouterEvent { ... }
    //Fails
    expect(IRouterEvent instanceof NavigationCancel).toBe(true); 

    No funcionará

    //Must use a class not a type
    export type RouterEvent { ... }
    //Fails
    expect(IRouterEvent instanceof NavigationCancel).toBe(true); 

    Como se puede ver en el código anterior, las clases se utilizan para comparar la instancia a los tipos NavigationStart|Cancelar|Error.

    Utilizando instanceof en un Tipo o de la Interfaz no es posible ya que el ts compilador despoja de estos atributos durante su proceso de compilación y antes de ser interpretado por el JIT o AOT. Las clases son una gran manera de crear un tipo que puede ser utilizado de precompilación, así como durante la JS en tiempo de ejecución.

    OriginalEl autor Alpha G33k

Dejar respuesta

Please enter your comment!
Please enter your name here