Как правильно использовать интерфейс Typescript на классах Immutable JS Record? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытался найти способ сделать это правильно, но пока не нашел подходящего решения. Я знаю, что неизменные записи - это фабрики. Мой код выглядит так:

import { Record } from 'immutable'

interface ISessionDefaults {
  id: number | null,
  email: string,
}

interface ISession {
  id: number,
  email: string,
}

const defaults: ISessionDefaults = {
  id: null,
  email: '',
}

class Session extends Record(defaults) implements ISession {
}

Я получаю ошибку типа при определении класса:

[tsserver 2420] [E] Class 'Session' incorrectly implements interface 'ISession'.
  Type 'Session' is missing the following properties from type 'ISession': id, email

Что понятно, поэтому я расширяю определение класса следующим образом:

class Session extends Record(defaults) implements ISession {
  id: number
  email: string
}

В этот момент я получаю еще одну ошибку типа: [tsserver 2564] [E] Property 'id' has no initializer and is not definitely assigned in the constructor.

ОК, так что время устанавливать значения по умолчанию. Я изменяю определение класса:

class Session extends Record(defaults) implements ISession {
  id: number = 0
  email: string = ''
}

Но это на самом деле не компилируется, так как я устанавливаю его напрямую. Ошибка: Error: Cannot set on an immutable record.

Полагаю, я могу определить метод constructor, но это означает вызов super после установки начальных значений, что также недопустимо.

...