类属性类型传递通过打字稿中的扩展

时间:2019-10-11 09:35:26

标签: typescript class generics types extends

在这种情况下,状态类型是正确的。

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 个答案:

答案 0 :(得分:3)

子类方法和属性不是基类方法和属性的contextually typed。这意味着在初始化属性时,TS将无法引用Partial<S>state基类的Foo的声明类型Baz

前一段时间,显然有一个相关的PR被中止了,因为在现实应用中cons outweighed the pros。因此,如果您不想像{Playground)那样在state中重新声明Baz类型:

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
}

其他链接