【问题标题】:stating that a property is not only "keyof" of a type but also an array of something声明一个属性不仅是一个类型的“keyof”,而且是一个数组
【发布时间】:2019-03-08 09:52:39
【问题描述】:

我有以下功能:

export function listMutations<S, M extends Model>(postfix: keyof S): MutationTree<S> {
  return {
    ADD(state, payload) {
      state[postfix].push(payload.value)
    },
    CHANGED(state, payload) {},
    REMOVED(state, payload) {},
    RELATIONSHIP_ADDED(state, payload) {},
    RELATIONSHIP_REMOVED(state, payload) {},
  }
}

其中S 表示特定的“状态树”,M 是给定的数据模型。 “模型”旨在适应状态树。例如,假设状态树如下所示:

export interface StateTree<M> {
  all: M[],
  byId: ...
}

传递给函数的postfix 值确定属性是“全部”还是其他,但假设--给定postfix 属性--:

  1. postfix 是状态树的keyof
  2. 并且postfix 属性的值是M 的数组

我已经输入了第一个条件,但是因为这种输入并没有告诉类型系统该值始终是一个数组,所以我在.push() 调用中遇到了类型错误。

然后我查看了这个问题以供参考:keyof-that-is-also-of-type-t。这在一定程度上有所帮助并导致了这种尝试:

export type ListPropertyCandidates<T> = Pick<T, { [K in keyof T]: T[K] extends Model[] ? K : never }[keyof T]>

export function listMutations<T>(postfix: keyof ListPropertyCandidates<T>): MutationTree<T> {
  return {
    ADD(state, payload) {
      state[postfix].push(payload.value)
    },
    CHANGED(state, payload) {},
    REMOVED(state, payload) {},
    RELATIONSHIP_ADDED(state, payload) {},
    RELATIONSHIP_REMOVED(state, payload) {},
  }
}

我认为在 ListPropertyCandidates 中包含 T[K] extends Model[] 可能会让我到达那里,但打字错误仍然存​​在,因为它无法将 state[postfix] 识别为始终是一个数组。

有人有什么想法吗?

【问题讨论】:

  • 你在代码外称它为prefix,但在代码内将它命名为postfix,它们应该是一样的吗?
  • 如果我理解正确的话,你可以像ADD&lt;V&gt;(state: {postfix: V[]}, payload: {value: V}) { state.postfix.push(payload.value);}这样定义state的类型
  • 对不起,应该到处说postfix;会更新

标签: typescript


【解决方案1】:

我认为不定义 state 本身的类型是不可能的

function listMutations<S, M extends Model>(postfix: keyof S): MutationTree<S> {
  return {
    ADD(state: Record<keyof S, M[]>, payload: {value: M}) {
      state[postfix].push(payload.value);
    },
    ...
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多