inicializar herencia clases clase typescript

herencia - inicializar clase typescript



¿Cómo se especifica que una propiedad de clase es un número entero? (6)

Estoy experimentando con TypeScript, y en el proceso de crear una clase con un campo "ID" que debería ser un entero, me he confundido un poco.

En primer lugar, en Visual Studio 2012 con el plugin de TypeScript, veo "int" en la lista de tipos de intelliSense. Pero aparece un error de compilación que dice "el nombre ''int'' no existe en el alcance actual".

Revisé las especificaciones de idioma y solo veo los siguientes tipos primitivos: número, cadena, booleano, nulo e indefinido. Sin tipo entero.

Entonces, me quedan dos preguntas:

  1. ¿Cómo debería indicar a los usuarios de mi clase que un campo en particular no es solo un "número" sino un número entero (y nunca un número flotante o número decimal)?

  2. ¿Por qué veo "int" en la lista intellisense si no es un tipo válido?

Actualización: Todas las respuestas que he recibido hasta ahora son acerca de cómo JavaScript no tiene un tipo int, sería difícil aplicar un tipo int en tiempo de ejecución ... Lo sé todo. Me pregunto si hay una forma de TypeScript para proporcionar una anotación a los usuarios de mi clase que este campo debería ser un número entero. Tal vez un comentario de algún formato en particular?


  1. Creo que no hay una forma directa de especificar si un número es un número entero o un punto flotante. En la sección de especificaciones de TypeScript 3.2.1, podemos ver:

    "... El tipo primitivo de número corresponde al tipo de primitiva de JavaScript con el mismo nombre y representa valores de punto flotante IEEE 754 de doble precisión de formato de 64 bits ..."

  2. Creo que int es un error en Visual Studio intelliSense. El correcto es el number .


Aquí hay una implementación de la interfaz numérica que no funciona en el boxeo. Creo que sería posible usar este diseño para crear un tipo entero


Bueno, como has visto, las letras mecanografiadas no tienen un tipo de datos flotante como el lenguaje javascript. Solo tiene el number que cubre todos los int y double al mismo tiempo; quizás deba hacer una función que tome un número y verifique si es un int o un double , devolviendo algún estado en caso de error / éxito. Algo así como el método de su clase:

function SetN(x:number) { var is_int = parseInt(x) === parseFloat(x); if(is_int) this.n = x; return is_int; } //.. y = 10.5; if(SetN(y)) { //OK } else { //error not set y isn''t a int }

Nota: no funciona para 10.0 ejemplo, si realmente no lo desea, tal vez deba convertirlo a cadena e intentar encontrar un . .


En TypeScript puedes aproximar lo que a veces se llama un tipo opaco usando un marcador.

// Helper for generating Opaque types. type Opaque<T, K> = T & { __opaque__: K }; // 2 opaque types created with the helper type Int = Opaque<number, ''Int''>; type ID = Opaque<number, ''ID''>; // using our types to differentiate our properties even at runtime // they are still just numbers class Foo { someId: ID; someInt: Int; } let foo = new Foo(); // compiler won''t let you do this due to or markers foo.someId = 2; foo.someInt = 1; // when assigning, you have to cast to the specific type // NOTE: This is not completely type safe as you can trick the compiler // with something like foo.someId = 1.45 as ID and it won''t complain. foo.someId = 2 as ID; foo.someInt = 1 as Int; // you can still consume as numbers let sum: number = foo.someId + foo.someInt;

Hacer esto le permite ser más explícito en su código en cuanto a qué tipos esperan sus propiedades, y el compilador no le permitirá asignar un valor primitivo sin un molde. Esto no produce ninguna salida .js adicional, y aún puede consumir y usar los valores según los tipos en los que se basan. En este ejemplo, estoy usando números, pero también puede usar cadenas y otros tipos.

Todavía puedes engañar al compilador para que acepte algo que no sea Int o Id en este ejemplo, pero debería saltar si intentas asignar 1.45 como Int o algo así. También tiene la opción de crear funciones auxiliares que use para crear sus valores para proporcionar validación en tiempo de ejecución.

Hay varias formas diferentes de crear tipos "marcados". Aquí hay un buen artículo: https://michalzalecki.com/nominal-typing-in-typescript/


TypeScript es un superconjunto de JavaScript, que no tiene un concepto de int. Solo tiene el concepto de un número, que tiene un punto flotante.

Filosóficamente, la cantidad de trabajo que el compilador tendría que hacer para aplicar solo números enteros para un tipo int de tipografía podría ser potencialmente masivo y en algunos casos aún no sería posible garantizar en tiempo de compilación que solo se asignarían números enteros, lo que Es por eso que no es posible agregar confiablemente un int a TypeScript.

Cuando inicialmente obtienes intelliSense en Visual Studio, no es posible que la herramienta determine qué suministrar, de modo que obtienes todo, incluso int, pero una vez que tratas algo de un tipo conocido, obtienes IntelliSense sensible.

Ejemplos

var myInt: number; var myString: string; myInt. // toExponential, toFixed, toPrecision, toString myString. // charAt, charCodeAt, concat, indexOf, lastIndexOf, length and many more...


int se reservó para futuras palabras clave de uso en versiones anteriores de javascript (ECMAScript, si lo prefiere). Pero ahora es una palabra válida (donde "ahora" equivale a "en la última especificación").

Por ejemplo, en 262 todavía estaba reservado, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Sería una buena adición al texto mecanografiado tener un tipo de datos int implementado, pero con todas las reglas de verificación y lanzamiento de tipos en tiempo de compilación disponibles.