Записи ImmutableJS не будут обнаруживать интерфейс с помощью Typescript

#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());