#javascript #typescript #ecmascript-6 #immutable.js
#javascript #typescript #ecmascript-6 #immutable.js
Вопрос:
Я пытаюсь запустить Typescript с неизменяемым 3.8.1.
import { Record } from "immutable";
class Person extends Record({
name: "viktor" as string,
}) {
getName() {
return this.name;
}
}
const person = new Person({ name: "petko" });
console.log(person.getName());
этот код выдает следующую ошибку:
Property 'name' does not exist on type 'Person'.
5 | }) {
6 | getName() {
> 7 | return this.name;
| ^^^^
8 | }
9 | }
но он компилируется и запускается. Однако, когда я пытаюсь добавить name: string;
только объявление getName (в теле класса), ошибка исчезает, но getName()
каждый раз возвращается undefined . Что я делаю не так?
Комментарии:
1. » выдает следующую ошибку, но она компилируется и запускается » — как это сочетается?
Ответ №1:
Я не настолько продвинут в TS, но, если я правильно понял, проблема в том, что, хотя свойство name
существует для type Person
, компилятор TypeScript не знает об этом, потому что оно создается динамически во время выполнения.
Итак, у вас есть два способа:
-
Используйте функцию неизменяемой записи
get
для чтения значения:import { Record } from "immutable"; class Person extends Record({ name: "viktor" as string, }) { getName() { return this.get("name"); } } const person = new Person({ name: "petko" }); console.log(person.getName());
-
Приведение к
any
:import { Record } from "immutable"; class Person extends Record({ name: "viktor" as string, }) { getName() { return (<any> this).name; } } const person = new Person({ name: "petko" }); console.log(person.getName());