Comprobación de tipo en jerarquía: getParentofType () -- typescript campo con types campo con typechecking camp Relacionados El problema

Type checking in hierarchy: getParentOfType()


1
vote

problema

Español

Todavía estoy teniendo dificultades con el sistema de comprobación de tipo de TypeScript. Supongamos que un compuesto sostiene una colección de elementos que se derivan de una clase base común. ¿Cómo puedo implementar una función que sube recursivamente la jerarquía y devuelve el primer ancho de un tipo dado?

  abstract class Employee {     public Superior: Employee;      /** THIS IS NOT WORKING */     public getSuperiorOfType<T extends Employee>( type: typeof T ): T     {         if (this instanceof T) return this;         else if (this.Superior !== undefined) return this.getSuperiorOfType(type);     } }  class Manager extends Employee {} class TeamLead extends Employee {} class Developer extends Employee {}  let tom = new Manager(); let suzanne = new TeamLead(); let ben = new Developer();  ben.Superior = suzanne; suzanne.Superior = tom;  let x = ben.getSuperiorOfType( Manager ); // x = tom   

Gracias de antemano por cualquier ayuda ...

Original en ingles

I'm still having a hard time with the type checking system of TypeScript. Suppose a composite that holds a collection of elements which all derive from a common base class. How can I implement a function that recursively goes up the hierarchy and returns the first anchestor of a given type?

abstract class Employee {     public Superior: Employee;      /** THIS IS NOT WORKING */     public getSuperiorOfType<T extends Employee>( type: typeof T ): T     {         if (this instanceof T) return this;         else if (this.Superior !== undefined) return this.getSuperiorOfType(type);     } }  class Manager extends Employee {} class TeamLead extends Employee {} class Developer extends Employee {}  let tom = new Manager(); let suzanne = new TeamLead(); let ben = new Developer();  ben.Superior = suzanne; suzanne.Superior = tom;  let x = ben.getSuperiorOfType( Manager ); // x = tom 

Thanks in advance for any help...

        

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 
  1. El tipo de 'Tipo de clase' no se puede declarar como typeof T . typeof En la posición de tipo se aplica solo a variables, no tipos. Debe usar el llamado firma constructor para eso:

      public getSuperiorOfType<T extends Employee>(type: { new(...args: any[]): T}): T   
  2. No se puede verificar si un objeto es instanceof de un parámetro de tipo genérico - instanceof T no funciona porque los parámetros de tipo genérico no existen en tiempo de ejecución. Pero tiene type como parámetro de función real, por lo que instanceof type6 debería funcionar.

  3. No hay una recursión real en su código: siempre está llamando getSuperiorOfType para el mismo objeto . Debe llamarlo como this.Superior.getSuperiorOfType(...) para subir un paso en la jerarquía.

      typeof0  
 
  1. The type of 'class type' can not be declared as typeof T. typeof in type position is applicable only to variables, not types. You need to use so-called constructor signature for that:

    public getSuperiorOfType<T extends Employee>(type: { new(...args: any[]): T}): T 
  2. You can't check if an object is instanceof of a generic type parameter - instanceof T does not work because generic type parameters do not exist at runtime. But you have type as actual function parameter, so instanceof type should work.

  3. There is no real recursion in your code - you are always calling getSuperiorOfType for the same this object. You need to call it as this.Superior.getSuperiorOfType(...) to move up one step in hierarchy.

    abstract class Employee {     public Superior: Employee;      public getSuperiorOfType<T extends Employee>(type: { new(...args: any[]): T}): T     {         if (this instanceof type) return this;         else if (this.Superior !== undefined) return this.Superior.getSuperiorOfType(type);     } }  class Manager extends Employee {} class TeamLead extends Employee {} class Developer extends Employee {}  let tom = new Manager(); let suzanne = new TeamLead(); let ben = new Developer();  ben.Superior = suzanne; suzanne.Superior = tom;   let x = ben.getSuperiorOfType(Manager);  console.log(x === tom); // true 
 
 

Relacionados problema

2  ¿Cuál es la mejor práctica cuando los valores de la opción de comprobación de tipo comprobación en una extensión RUBY C?  ( What is the best practice when type checking option hash values in a ruby c exte ) 
Estoy desarrollando una extensión C para Ruby, una de las funciones de la biblioteca C que accediendo recibe una estructura de opciones que parece estar tradu...

7  ¿Por qué el "SRB TC" está encontrando los métodos "esperados" y "eq" para mis pruebas de RSPEC?  ( Why isnt srb tc finding the expect and eq methods for my rspec tests ) 
Estoy probando Sorbet en un proyecto experimental de código abierto ( ruby_crystal_codemod ). No puedo averiguar cómo obtener la verificación de tipo para tra...

1  TypeScript que no hace cumplir los tipos  ( Typescript not enforcing types ) 
Tengo este código muy simple: for_each111 TypeScript versión 2.2.2 no se queja de que el resultado solo puede tener el valor "ABC". ¿Por qué? ...

7  ¿Qué cheques de tipo funcionan Raku en el tiempo de compilación? ¿Que eso cambie en el futuro?  ( What type checks does raku perform at compile time may that change in the futur ) 
Actualmente (a partir de agosto de 2020) Rakudo no escribe los valores de retorno de las funciones en el tiempo de compilación; Es decir, no proporciona garan...

0  ¿Dónde está el tipo de tipo paramétrico de lugar correcto en lenguajes dinámicos?  ( Where is the right place parametric type checking in dynamic languages ) 
Considere lo siguiente. (en pseudocode). Class { hello world public constructor(hello, world) { if (hello is not String) ...

5  ¿Alguien puede explicar estas pocas líneas de MSIL?  ( Can someone explain these few lines of msil ) 
¿Puede alguien explicar estas pocas líneas de MSIL? ¿Por qué mueve un valor de la pila de evaluación a una variable local, solo para moverla de nuevo y devolv...

0  Cómo verificar si un valor es un número entero en JavaScript (caso especial 1.0 debe ser flotante)  ( How to check if a value is an integer in javascript special case 1 0 should be ) 
Estoy escribiendo algunas funciones de cheques de tipo. Quiero: isinteger isfloat Mientras escribe isinteger, noté que Isinteger (1.0) devuelve verdad...

13  ¿Cómo se supone que debo usar el paquete Haskell-Type-exts?  ( How am i supposed to use the package haskell type exts ) 
Estoy tratando de seleccionar un fragmento de código proporcionado como una cadena. Encontré el paquete Haskell-Type-Exts ( enlace de hackage ) que Parece p...

1  Computar diferencias entre Point2D <UCS> y Point2D <GCS>  ( Compute differences between point2ducs and point2dgcs ) 
Esto es relacionado con el hilo un hilo que se publicó anteriormente en este foro. ¿Cuáles son algunos marcos recomendados? ¿Para manipular datos espacia...

2  El flujo no es la captura de errores de tipo para un componente importado  ( Flow is not catching type errors for an imported component ) 
Tengo un componente simple ErrorBoundary que se usa en otro componente. Ambos componentes se verifican por flujo (es decir, tienen la bandera ErrorComponen...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos