Тип атрибута класса мимо проходит в машинописи - PullRequest
0 голосов
/ 11 октября 2019

В этом случае тип состояния правильный.

export type Flatten<T> = T extends infer U ? { [K in keyof U]: U[K] } : never

class Foo<S> {
  state?: Partial<S>
}

class Bar<S> extends Foo<Flatten<S & { b: string }>> {
  async getInitialState(initialState: S) {
    return {
      ...initialState,
      b: 'bar'
    }
  }
}

const initialState = {
  a: 'baz'
}


class Baz extends Bar<typeof initialState> {
}

let baz = new Baz()
baz.state
// Partial<{
//   a: string;
//   b: string;
// }> | undefined

, но в этом случае тип состояния будет переопределен при назначении нового значения

class Baz extends Bar<typeof initialState> {
  state = initialState
}

let baz = new Baz()
baz.state
// {
//   a: string;
// }

Донне хочу менять тип состояния в случае 2. как мне поступить?

1 Ответ

3 голосов
/ 11 октября 2019

Методы и свойства подкласса не контекстно типизируются методами и свойствами базового класса. Это означает, что TS не сможет ссылаться на объявленный тип Partial<S> для state из Foo базового класса в Baz, когда вы инициализируете свойство.

Некоторое время назад, по-видимому,был связанный PR , который был прерван, потому что минусы перевешивали плюсы в реальных приложениях. Итак, если вы не хотите повторно объявлять тип state в Baz как ( Playground ):

type State<S> = S & { b: string }

class Bar<S> extends Foo<State<S>> { }

class Baz extends Bar<typeof initialState> {
  state?: Partial<State<typeof initialState>> = initialState
}

, вы можете передать объявленный initialValueс явным соответствующим типом Baz:

const partialInitialState: Partial<State<typeof initialState>> | undefined = initialState

class Baz extends Bar<typeof initialState> {
  state = partialInitialState
}

Дополнительные ссылки

...