Таким образом, если вам не нужно использовать null
со специальным значением, вы можете упростить свой класс
export default class FlowerBed {
canv?: HTMLCanvasElement;
ctx?: CanvasRenderingContext2D;
p2d: Path2D = new Path2D();
t: number = 0;
currentPoint: Array<number> = [160, 350];
to: number = 0;
image?: HTMLImageElement;
imagesrc?: CanvasImageSource;
pattern?: CanvasPattern;
constructor(garden: HTMLCanvasElement) {
// ...
}
someMethod() {
// Note the exclamation mark – it tells ts you are sure the property has a value
return this.canv!.getBoundingClientRect();
}
}
?
после имени поля означает, что поле может отсутствовать, что почти совпадает как имеющий это undefined
. В зависимости от вашего опыта, вы можете предпочесть помещать значения в конструктор, но вы все равно можете избежать нулевых назначений здесь.
Стоит отметить, что неинициализированные свойства не представлены в объекте, поэтому проверки во время выполнения, такие как hasOwnProperty
return false
.
const fb = new FlowerBed(canvasEl);
fb.hasOwnProperty('ctx'); // false
Так что, если это важно, вы можете инициализировать их, но не обязательно делать это в конструкторе.
export default class FlowerBed {
canv?: HTMLCanvasElement;
ctx?: CanvasRenderingContext2D = undefined;
// ...
}
Это может быть полезно, когда есть случай, когда свойство может получить некоторое значение nulli sh во время выполнения, и это одна из причин, по которой некоторые разработчики различают значения guish undefined
и null
, используя undefined
в качестве "еще не инициализировано" и null
как "пустое или несуществующее значение"