Este es un ejemplo de los documentos de MDN para el uso de una new palabra clave
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; } const car1 = new Car('Eagle', 'Talon TSi', 1993);Creo que la versión TS de la función sería:
/* car type */ type CarDetails = { make: string; model: string; year: number; } /* setting this to type CarDetails */ function Car(this:CarDetails, make: string, model:string, year:number) { this.make = make; this.model = model; this.year = year; } Esto me da intellisense/autocompletar mientras escribo el método, pero ¿cómo hago que TS infiera tipos al crear una instancia con una new palabra clave? Incluso después de mecanografiar el método, crear una instancia como esta:
const car1 = new Car('Eagle', 'Talon TSi', 1993); todavía mantiene car1 como tipo any
car1 deduzca que es this tipo del método Car ? (sin establecer explícitamente el tipo para el objeto de instancia, const car1: CarDetails = new Car(...; )
Podrías usar clases en su lugar:
class Car { make: string; model: string; year: number; constructor(make: string, model: string, year: number) { this.make = make; this.model = model; this.year = year; } } // usage is the same const car1 = new Car('Eagle', 'Talon TSi', 1993);Obviamente, la sintaxis de clase debería ser el camino a seguir, pero como usted, también estoy corriendo en círculos tratando de encontrar la solución correcta que genere la antigua sintaxis JS válida. Esta es una buena aproximación que encontré en esta respuesta aleatoria y está mal explicada en la documentación oficial de Typescript . Aquí está la parte relevante que he modificado para mejorarla:
// Only instance members here. export interface Circle { // Name the interface with the same than the var. radius: number; area: () => number; perimeter: () => number; } // You could define static members here. interface CircleConstructor { new(radius: number): Circle; } export const Circle = function(this: Circle, radius: number) { const pi = 3.14; this.radius = radius; this.area = function () { return pi * radius * radius } this.perimeter = function () { return 2 * pi * radius; } } as unknown /*as any*/ as CircleConstructor; // Note the trust-me casting const c = new Circle(3); // okay Esto viene con algunos problemas. Por ejemplo, el hecho de que esté usando any tipo que esté prohibido o el uso necesario del operador as que es megafeo. Como mejora, he usado unknown en lugar de any , pero el problema central permanece. Esto hace que la herramienta de pelusa no se queje, por lo que es una gran mejora con respecto a any .
Esta es la mejor solución que he encontrado hasta ahora. Los desarrolladores de mecanografiados son conscientes de esto, pero han decidido no proporcionar soporte para este tipo de "sintaxis".