Первый пример TypeScript wiki (TypeScript-Handbook/pages/Classes.md)

76
11

https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Classes.md

Я пытаюсь изучить TypeScript. Первый пример в классах:

class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}

let greeter = new Greeter("world");

Это кажется простым, но когда я записываю greeter: console.log(greeter); вместо получения "Hello World" я получаю "Greeter {greeting:" world "}

Моя настройка: package.json: (просто TypeScript, никаких других библиотек)

{
"name": "typescript learning",
"version": "1.0.0",
"scripts": {
"start": "concurrently \"npm run tsc:w\" \"npm run lite\" ",
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server"
},
"license": "ISC",
"dependencies": {
"concurrently": "^2.0.0",
"lite-server": "^2.1.0",
"typescript": "^1.8.0"
}
}

и tsconfig.json просто по умолчанию:

{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules",
"typings/main",
"typings/main.d.ts",
"typescript.notes.ts"
]
}

Итак, я пропустил что-то фундаментальное? Или это просто неполный пример, который нельзя оценивать? Очевидно, что я все еще новичок в TypeScript и не имею никакого фона, чтобы брать примеры, отличные от их номинальной стоимости. Большое спасибо за любой вклад, -Mike

спросил(а) 2021-01-19T21:01:43+03:00 2 месяца, 3 недели назад
1
Решение
62

Ваша проблема:

let greeter = new Greeter("world");
console.log(greeter);

Это показывает только экземпляр класса и фактически не вызывает метод класса.

Так что вы хотите:

let greeter = new Greeter("world");
console.log(greeter.greet());

Чтобы ответить на ваш вопрос в комментариях:

Один быстрый вопрос, даже несмотря на то, что приветствие метода является частью класса, оно не получает оценку, вызвав класс? Я вижу, что это так, но опять же, не то, что я ожидал. Я пытаюсь получить модель, на мой взгляд, для использования класса вместо отдельной функции.

По своей сути, класс в основном представляет собой не что иное, как набор методов и переменных, которые по какой-то причине логически "принадлежат" вместе.

Например, если у меня есть класс Car, у него может быть переменное fuel и методы drive() и refuel(). Вызов методов drive() и refuel() изменит переменное fuel. Таким образом, вы можете легко создать один, два или сто экземпляров одного класса и все равно легко отслеживать материал. Без объектно-ориентированного программирования все это было бы намного сложнее отслеживать, особенно когда вы начинаете создавать несколько автомобилей.

Очевидно, что вы не хотите сразу запускать drive() при создании нового автомобиля! В вашем коде есть метод constructor, который запускается автоматически каждый раз, когда создается класс. Это часто полезно для инициализации некоторых вещей, но на самом деле это не что иное, как ярлык для чего-то вроде:

let greeter = new Greeter();
greeter.set_message("world")

За исключением того, что вы не можете забыть его использовать ;-) Конструктор часто используется для переменных, которые должен всегда иметь класс, например строка в вашем примере, или, например, в нашем примере, когда топливо выбрано на начальном уровне. Следовательно, это имя, необходимо построить класс.

В "реальном мире" большинство классов являются немного более абстрактными, и есть некоторые функции, которые позволяют вам делать больше (например, наследование), но основная идея одинаков: класс представляет собой набор, если методы и переменные, которые логически принадлежат к одной и той же "вещи" или "объекту" - я чувствую, что некоторые гиды делают это намного сложнее, чем это должно быть кстати, поскольку они сразу же хотят ввести понятия, такие как наследование, с самого начала без полного объяснения основной цели классов.

Не беспокойтесь, если вы не полностью понимаете все, когда только начинаете. Я думаю, что мало кто это делает. Я, конечно, этого не делал. Вначале почти все борются с такими вещами.

ответил(а) 2021-01-19T21:01:43+03:00 2 месяца, 3 недели назад
44

greeter - это объект. Итак, вызываем console.log(greeter); регистрирует фактический объект, чье свойство greeting установлено в world.

Вы хотите greeter.greet(), чтобы увидеть "Hello, world".

ответил(а) 2021-01-19T21:01:43+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема