Développement d’applications d’entreprise 2

Développement d’applications d’entreprise 2


1.1- TypeScript

1.2- Angular

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.

Decorators

📚 Documentation

ts
class Greeter {
@format("Hello, %s")
greeting: string;

constructor(@required message: string) {
this.greeting = message;
}

greet() {
let formatString = getFormat(this, "greeting");
return formatString.replace("%s", this.greeting);
}
}

Comme les annotations en C#...

Exemple C#
public class Passport
{
[Key]
[Column(Order=1)]
public int PassportNumber { get; set; }
[Key]
[Column(Order = 2)]
public string IssuingCountry { get; set; }
public DateTime Issued { get; set; }
public DateTime Expires { get; set; }
}

public class PassportStamp
{
[Key]
public int StampId { get; set; }
public DateTime Stamped { get; set; }
public string StampingCountry { get; set; }

[ForeignKey("Passport")]
[Column(Order = 1)]
public int PassportNumber { get; set; }

[ForeignKey("Passport")]
[Column(Order = 2)]
public string IssuingCountry { get; set; }

public Passport Passport { get; set; }
}

Syntaxe

ts
copier
// Pour executer
// npx ts-node --compilerOptions '{"module": "none"}' $FILENAME

let pseudo: string

// console.log(`Hello ${pseudo}`) // uninitialized

pseudo = 'James'
console.log(`Hello ${pseudo}`)

// pseudo = null // type validation

// Pour eviter les REPETITIONS
// type NullableName = string | undefined | null

interface Greeter {
// REPETITION
name: string | null // union type

greet?(): void // optional
}

class Person implements Greeter { // interface
// REPETITION
readonly name: string | null
// public par defaut
// get, set, readonly

// REPETITION
// plus strict mais pas moins
constructor(name: string) { // name?: optional param
this.name = name // Initializer assertion si on enleve assignation ici
// et | undefined et ajoute name! dans declaration
}

greet() {
const name = this.name ?? "anonymous" // null check
console.log(`Hello ${name.toUpperCase()}`)

// VS type assertion

if (this.name) {
// Apres le if, sera DEFINITIVEMENT pas null
console.log(`Hello ${this.name.toUpperCase()}`) // this.name est de type string!
}

// VS

// console.log(`Hello ${this.name.toUpperCase()}`) // ! vs ?
}
}

// function ahoy(greeter: Person) { // Le type est strictement la classe
function ahoy(greeter: Greeter) { // L'interface defini la FORME, les signatures, donc plus souple
console.log(`Ahoy ${greeter.name}`)
}

let p = new Person("James")

// p.name = 'a' // readonly

p.greet()

// p = new Person() // si le param du constructeur est optionnel
// p.greet()

ahoy(p)

ahoy({name: "Mathieu"}) // duck typing, ne fonctionne pas si ahoy(...: Person)