typescript - I TS, frågetecken efter definierat metodnamn
Jag förstår användningen av TS ? för att deklarera valfria parametrar, fält, valfria metoder, etc. Men jag har sett kod som sätter ? efter en metod som är definierad i en klass, som detta:
class Foo {
public myMethod?(...) {
... code
}
}
Varför är detta användbart?
Svar #1
Sprang just in i detta idag. Frågetecknet ? efter en metod tillåter en implementerande klass att inte implementera den metoden. Det vill säga, att implementera den metoden är valfritt. Kan göras för gränssnitt eller klasser. Om du väljer att implementera den valfria metoden behöver du inte lägga till ? om det inte är avsett att en efterföljande implementering också ska vara valfri.
Här är ett påtvingat exempel
export interface Foo {
bar(): string;
baz?(): string;
}
// Buzz can implement gazz optionally
export class Buzz implements Foo {
readonly gar: string;
readonly jazz: string;
constructor() {
this.gar = 'GAR!';
this.jazz = 'jazz!';
}
bar() {
return this.gar;
}
gazz() { // no ? means subsequent implementations need gazz
return this.jazz;
}
}
// Stuzz needs to implement method gazz, but does not
export class Stuzz implements Buzz {
readonly gar: string;
readonly jazz: string;
constructor() {
this.gar = 'ZAR!';
this.jazz = 'jazz!';
}
bar() {
return this.gar;
}
/**
* Without gazz we get an error:
* Class 'Stuzz' incorrectly implements class 'Buzz'. Did you mean to extend 'Buzz' and inherit its members as a subclass?
* Property 'gazz' is missing in type 'Stuzz' but required in type 'Buzz'.
*/
// gazz() {
// return this.jazz;
// }
}
