Wie in der Antwort von @Benson kommentiert, habe ich dieses Beispiel in meinem Code verwendet, und ich fand es sehr nützlich. Allerdings fand ich mit dem Object is possibly 'undefined'.ts(2532)
Fehler, als ich versuchte, Berechnungen mit den Typen meiner Klassenvariablen durchzuführen, da das Fragezeichen dazu führt, dass sie vom Typ AssignedType | undefined
. Auch wenn der undefinierte Fall bei der späteren Ausführung oder mit dem Compiler-Typ enforce behandelt wird <AssignedType>
Ich konnte den Fehler nicht beheben, also konnte ich die Argumente nicht optional machen, sondern habe einen separaten Typ für die Argumente mit den Fragezeichen params und die Klassenvariablen ohne die Fragezeichen erstellt. Umständlich, aber funktioniert.
Hier ist der Originalcode, der den Fehler in der Klassenmethode() aufweist, siehe unten:
/** @class */
class Box {
public x?: number;
public y?: number;
public height?: number;
public width?: number;
// The Box class can work double-duty as the interface here since they are identical
// If you choose to add methods or modify this class, you will need to
// define and reference a new interface for the incoming parameters object
// e.g.: `constructor(params: BoxObjI = {} as BoxObjI)`
constructor(params: Box = {} as Box) {
// Define the properties of the incoming `params` object here.
// Setting a default value with the `= 0` syntax is optional for each parameter
const {
x = 0,
y = 0,
height = 1,
width = 1,
} = params;
// If needed, make the parameters publicly accessible
// on the class ex.: 'this.var = var'.
/** Use jsdoc comments here for inline ide auto-documentation */
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}
method(): void {
const total = this.x + 1; // ERROR. Object is possibly 'undefined'.ts(2532)
}
}
const box1 = new Box();
const box2 = new Box({});
const box3 = new Box({ x: 0 });
const box4 = new Box({ x: 0, height: 10 });
const box5 = new Box({ x: 0, y: 87, width: 4, height: 0 });
Die Variable kann also nicht in den Methoden der Klasse verwendet werden. Wenn das zum Beispiel so korrigiert wird:
method(): void {
const total = <number> this.x + 1;
}
Jetzt erscheint dieser Fehler:
Argument of type '{ x: number; y: number; width: number; height: number; }' is not
assignable to parameter of type 'Box'.
Property 'method' is missing in type '{ x: number; y: number; width: number; height:
number; }' but required in type 'Box'.ts(2345)
Als ob das ganze Argumentationsbündel nicht mehr optional wäre.
Wenn also ein Typ mit optionalen Argumenten erstellt wird und die Klassenvariablen aus dem optionalen Bereich entfernt werden, erreiche ich, was ich will: die Argumente sind optional und können in den Klassenmethoden verwendet werden. Unten der Lösungscode:
type BoxParams = {
x?: number;
y?: number;
height?: number;
width?: number;
}
/** @class */
class Box {
public x: number;
public y: number;
public height: number;
public width: number;
// The Box class can work double-duty as the interface here since they are identical
// If you choose to add methods or modify this class, you will need to
// define and reference a new interface for the incoming parameters object
// e.g.: `constructor(params: BoxObjI = {} as BoxObjI)`
constructor(params: BoxParams = {} as BoxParams) {
// Define the properties of the incoming `params` object here.
// Setting a default value with the `= 0` syntax is optional for each parameter
const {
x = 0,
y = 0,
height = 1,
width = 1,
} = params;
// If needed, make the parameters publicly accessible
// on the class ex.: 'this.var = var'.
/** Use jsdoc comments here for inline ide auto-documentation */
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}
method(): void {
const total = this.x + 1;
}
}
const box1 = new Box();
const box2 = new Box({});
const box3 = new Box({ x: 0 });
const box4 = new Box({ x: 0, height: 10 });
const box5 = new Box({ x: 0, y: 87, width: 4, height: 0 });
Ich freue mich über Kommentare von allen, die sich die Zeit nehmen, zu lesen und zu verstehen, worauf ich hinauswollte.
Vielen Dank im Voraus.