В некоторых случаях свойства и методы в классе создаются только для внутреннего использования. Разработчики не хотят давать возможность вызывать их снаружи, иначе их случайно могут начать использовать, что не планировалось.
В языках с классами принято разделять свойства на публичные, приватные и защищенные. Первые доступны для всех, вторые могут использоваться только внутри класса, а третьи — внутри класса и в его наследниках. В этом уроке разберем каждый из этих видов.
По умолчанию в TypeScript все свойства публичные. Это можно обозначить явно с помощью ключевого слова public
:
class Point {
public x: number;
public y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
public someMethod() {
// some logic
}
}
Также свойства можно сделать приватными. Тогда пропадет возможность обращаться к ним снаружи напрямую:
class Point {
private x: number;
private y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
const p = new Point(10, 8);
p.x; // Property 'x' is private and only accessible within class 'Point'.
p.y; // Property 'y' is private and only accessible within class 'Point'.
И наконец, свойства можно сделать защищенными. Это значит, что они доступны внутри класса и в наследниках:
class Point {
protected x: number;
protected y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point {
protected z: number;
constructor(x: number, y: number, z: number) {
super(x, y);
this.z = z;
}
public getCoordinates() {
return [this.x, this.y, this.z]; // OK
}
}
const p = new Point3D(10, 8, 5);
p.x; // Property 'x' is protected and only accessible within class 'Point' and its subclasses.
p.y; // Property 'y' is protected and only accessible within class 'Point' and its subclasses.
p.z; // Property 'z' is protected and only accessible within class 'Point3D' and its subclasses.
Реализуйте класс ImageCustomFile
, который расширяет (extends
) класс CustomFile
дополнительными приватными полями: width
, height
. Также переопределите метод toString()
. Теперь он должен дополнительно выводить <width>x<height>
.
const imageCustomFile = new ImageCustomFile({
name: 'image.png',
size: 100,
width: 200,
height: 300,
});
console.log(imageCustomFile.toString()); // image.png (100 bytes) 200x300
Чтобы вызвать метод родительского класса, используйте super.toString()
.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Привет! Я Тота и моя задача помочь в обучении. Чтобы активировать меня, нужно зарегистрироваться или залогиниться, если у вас уже есть аккаунт
Ваше упражнение проверяется по этим тестам
1import { expect, test } from 'vitest'
2import ImageCustomFile from './index';
3
4test('ImageCustomFile', () => {
5 const imageCustomFile = new ImageCustomFile({
6 name: 'image.png',
7 size: 100,
8 width: 200,
9 height: 300,
10 });
11
12 expect(imageCustomFile.toString()).toBe('image.png (100 bytes) 200x300');
13
14 const imageCustomFile2 = new ImageCustomFile({
15 name: 'image2.png',
16 size: 400,
17 width: 500,
18 height: 600,
19 });
20
21 expect(imageCustomFile2.toString()).toBe('image2.png (400 bytes) 500x600');
22 // @ts-expect-error - private property
23 expect(imageCustomFile2.name).toBe('image2.png');
24 // @ts-expect-error - private property
25 expect(imageCustomFile2.size).toBe(400);
26 // @ts-expect-error - private property
27 expect(imageCustomFile2.width).toBe(500);
28 // @ts-expect-error - private property
29 expect(imageCustomFile2.height).toBe(600);
30});
31
Решение учителя откроется через: