2017-09-29 2 views
1

J'utilise un projet mélangé avec javascript et tapuscrit. Les fichiers de déclaration pour les modules peuvent être facilement créés en utilisant - déclarer le module. Mais comment puis-je créer une déclaration pour un fichier javascript dans mon dossier actuel?Déclarations typographiques pour le fichier javascript

Ex -

player.js - 
var Player = function() {}; 
Player.prototype.validate = function() {}; 

Comment puis-je créer la déclaration afin que je puisse l'étendre dactylographiée. Je veux faire quelque chose comme ça -

player.ts - 
let Player = require('./player'); 
Player.prototype.login = function() { 
    this.validate(); 
} 

Je sais que le code ci-dessus fonctionne en définissant le type du joueur comme tout, mais je ne serai pas capable de taper vérifier.

Répondre

1

tapuscrit ne comprend pas la syntaxe prototypal/fonctions constructeur: il n'y aura pas IntelliSense. Il préfère les classes ES6.

La fonction constructeur JavaScript Player est équivalent à cette définition de classe tapuscrit:

// -- player.d.ts -- 
declare class Player { 
    validate(): void; 
} 

Ensuite, pour ajouter une méthode à la classe Player, il y a deux options:

  1. Plus tapuscrit manières idiomatiques: héritage de classe ou composition de classe
  2. Un compromis pour continuer à utiliser la syntaxe prototypique en TypeScript et obtenir toujours l'intellisense: interf ace

Exemples de code:

// -- authenticated-player.ts -- 
import { Player } from './player'; 

// Option #1a: class inheritance 
class AuthenticablePlayer extends Player { 
    login() { 
    this.validate(); 
    } 
} 

const p1a = new AuthenticablePlayer(); 
p1a.login(); 

// Option #1b: class composition + delegation 
class AuthenticablePlayerB { 
    private player = new Player(); 

    login() { 
    this.validate(); 
    } 

    validate() { 
    this.player.validate(); 
    } 
} 

const p1b = new AuthenticablePlayerB(); 
p1b.login(); 

-

// Option #2: prototype extension + facade interface + type assertion 
const Player: any = require('./player'); 

Player.prototype.login = function() { 
    this.validate(); 
} 

interface IPlayer { 
    login(): void; 
    validate(): void; 
} 

function createPlayer(): IPlayer { 
    return new Player(); 
} 

const p2 = createPlayer(); 
p2.login(); 
+0

Pour plus de détails sur la différence entre 'declare class' et' interface', voir http://stackoverflow.com/a/14348084/1704166 –

+0

espérait qu'il y avait un moyen d'ajouter à la classe actuelle sans l'étendre. Mais je suppose que je vais devoir prolonger. – Nishant

0

Vous pouvez créer une interface dans votre fichier TypeScript et le définir comme type de lecteur.

interface IPlayer { 
 
    validate(); 
 
} 
 

 
let Player: IPlayer = require('./player'); 
 

 
Player.prototype.login = function() { 
 
    this.validate(); 
 
}

+0

erreur TS2339: 'prototype' de la propriété n'existe pas sur le type 'IUser'. – Nishant

0

Pour développer la réponse de Sabbir ici (pas assez dans les commentaires)

interface IPlayer { 
    validate(): void 
    login():void 
} 

vieux code js

var Player = function() { } 
Player.prototype.validate = function() {} 

utilisant dans ts projet

// import/require here, left out for brevity 
Player.prototype.login = function() { 
    this.validate() 
} 

créer un joueur - login et valider maintenant complétion automatique

let p: IPlayer = new Player() 
p.login() 
p.validate() 
+0

mais la complétion automatique ne fonctionnera pas dans la fonction du lecteur – Nishant

+0

Je ne connais pas votre cas d'utilisation de projet exact mais personnellement je préférerais créer une classe Typescript et copier les méthodes JS. Ensuite, vous obtiendrez le code complet.Vérifiez l'édition – Kokodoko

+0

C'est un très gros cours et je ne veux pas mélanger le javascript et le code tapuscrit. – Nishant