L'écosystème JavaScript possède une variante fortement typée, TypeScript, permettant un encadrement plus rigoureux de l'expérience de développement. On ne peut l'exécuter directement dans le navigateur(qui ne comprend que JS), il faut d'abord le transpiler.
// npx ts-node --compilerOptions '{"module": "none"}' $FILENAME
let pseudo: string
// console.log(`Hello ${pseudo}`) // uninitialized
pseudo = 'James'
console.log(`Hello ${pseudo}`)
// name = null // type validation
interface Greeter {
name: string | undefined // union type
greet?(): void // optional
}
class Person implements Greeter { // interface
readonly name: string | undefined
// public par defaut
// get, set, readonly
constructor(name?: string) { // optional param
this.name = name // Non-null assertion si on enleve assignation ici et | undefined et ajoute name!
}
greet() { // plus strict mais pas moins
const name = this.name ?? "anonymous" // null check
console.log(`Hello ${name.toUpperCase()}`)
}
}
// function ahoy(greeter: Person) {
function ahoy(greeter: Greeter) {
console.log(`Ahoy ${greeter.name}`)
}
let p = new Person()
// p.name = 'a' // readonly
p.greet()
p = new Person("James")
p.greet()
ahoy(p)
ahoy({name: "Mathieu"}) // duck typing
// Decorators
// https://www.typescriptlang.org/docs/handbook/decorators.html