【发布时间】: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 属性--:
-
postfix是状态树的keyof - 并且
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<V>(state: {postfix: V[]}, payload: {value: V}) { state.postfix.push(payload.value);}这样定义state的类型 -
对不起,应该到处说
postfix;会更新
标签: typescript