Le TypeScript est un bon moyen de mieux organiser et mieux structurer son code. En revanche la création d'un projet peut parfois poser problème. Microsoft propose d'ailleurs un squelette de projet mais il possède de nombreuses dépendances et se base avant tout sur la création d'un projet expressjs (ce qui ne correspond pas forcément à tous les cas d'utilisation).
Travailler en TypeScript
La première étape est donc de configurer le projet pour pouvoir travailler avec le langage TypeScript. Les sources seront placées dans un dossier src/
et compilées dans un dossier dist/
. On commence donc par installer les dépendances nécessaires à ce fonctionnement.
npm i --save-dev typescript nodemon concurrently @types/node
Ensuite il va valloir créer le fichier de configuration pour détailler comment le code doit être convertit du TypeScript vers le JavaScript.
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true,
"outDir": "dist",
"target": "es6",
"strict": true
},
"include": [
"src/**/*"
]
}
Une fois cela fait on peut configurer les scripts de notre package.json
pour lancer la compilation automatique des fichiers .ts
et le lancement de l'application NodeJS.
{
"name": "tsnode",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "concurrently -k -n \"Typescript,Node\" -p \"[{name}]\" -c \"blue,green\" \"tsc --watch\" \"nodemon dist/index.js\"",
"start": "tsc && node dist/index.js"
}
// ...
}
Les tests unitaires
Maintenant que l'on sait écrire le code de notre application il faut aussi être capable d'écrire nos tests en utilisant TypeScript. On va pour cela utiliser l'outil de test jest sur lequel on va installer un preprocesseur pour gérer le TypeScript.
npm i --save-dev jest @types/jest ts-jest
On va ensuite créer un fichier jest.config.js
pour configurer le lancement de nos tests
module.exports = {
transform: {
'^.+\\.ts$': 'ts-jest'
},
moduleFileExtensions: [
'js',
'ts'
],
testMatch: [
'**/test/**/*.test.(ts|js)'
],
testEnvironment: 'node'
}
Et enfin ajouter les scripts à notre fichier package.json
.
{
// ...
"scripts": {
"test": "jest --verbose",
"test-watch": "jest --verbose --watchAll",
// ...
}
// ...
}
Et voila ! On peut dès maintenant créer nos tests dans le dossier test/
de notre projet.
Dépendances sans définitions
Le dernier problème que l'on peut rencontrer est l'utilisation de dépendances qui ne possède pas de fichier de déclarations. Fichiers pour lesquels TypeScript ne sera pas en mesure de trouver les types des fonctions ou des propriétés. Pour l'aider il faudra alors créer un fichier *.d.ts
qui détaille le fonctionnement du module. Il est aussi possible d'y déclarer des interfaces qui pourront ensuite être utilisées dans notre application. Par exemple :
declare interface WarframeItem {
name: string,
uniqueName: string,
secondsPerShot?: number,
damagePerShot?: number[]
}
declare module 'warframe-items' {
interface WarframeItemsOptions {
category: string[]
}
class WarframeItems extends Array<WarframeItem> {
constructor (options: WarframeItemsOptions)
}
export = WarframeItems
}