我有以下情况,我正在TypeScript中开发vuex插件以自动从服务器获取所需的数据。 这是我的状态定义:
export interface RootState {
users: { [id: string]: User };
someNestedSection: {
currentUserAccount: Account
}
}
并且我为对象创建了类型,描述了如何获取这些资源:
export type RemoteOptions<T> = {
readonly [K in keyof T]?: RemoteOptions<T[K]>|{ fetchResource: (queryData?: any) => T[K]|any };
};
所以我的RemoteOptions<T>
对象看起来像这样:
const options: RemoteOptions<RootState> = {
users: {
fetchResource: (userId: number) => 'this is NOT strictly checked'
},
someNestedSection: {
currentUserAccount: {
fetchResource: () => new Account(/* some data from server */)
}
}
}
我的RemoteOptions<T>
定义几乎可以对所有内容进行类型检查,它强制RemoteOptions<RootState>
对象只包含RootState
具有的那些属性(包括嵌套属性),甚至可以强制执行(如果返回类型没有|any
,则fetchResource
的{{1}}函数仅返回options.someNestedSection.currentUserAccount
个对象,但我不知道如何执行Account
返回User
上的值。
问题出在options.users.fetchResource
的返回类型上,我在那里有fetchResource: (queryData?: any) => T[K]|any
,我需要用any
之类的东西替换any
,但是我不知道应该怎么做(TypeScript中没有memberof T[K]
运算符,只有memberof
,但是在这种情况下不适用)。
有人有什么主意吗?
答案 0 :(得分:0)
好的,我已经弄清楚了这个:)
新定义是:
readonly [K in keyof T]?: RemoteOptions<T[K]>|{ fetchResource: (queryData?: any) => T[K]|T[K][any] };
所以我强迫TypeScript严格检查返回值是否为T[K][any]
的实例,我认为这意味着“ T[K]
的任何成员的类型”。
似乎可行。我希望这是正确的方法,如果不是这样,如果有人向我指出,我将不胜感激。