动态索引对象上的TypeScript严格成员类型检查

时间:2019-02-28 22:45:40

标签: typescript vuex

我有以下情况,我正在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,但是在这种情况下不适用)。

有人有什么主意吗?

1 个答案:

答案 0 :(得分:0)

好的,我已经弄清楚了这个:)

新定义是:

readonly [K in keyof T]?: RemoteOptions<T[K]>|{ fetchResource: (queryData?: any) => T[K]|T[K][any] };

所以我强迫TypeScript严格检查返回值是否为T[K][any]的实例,我认为这意味着“ T[K]的任何成员的类型”。

似乎可行。我希望这是正确的方法,如果不是这样,如果有人向我指出,我将不胜感激。