【问题标题】:TypeScript strict member type check on dynamically indexed objectTypeScript 对动态索引对象的严格成员类型检查
【发布时间】:2019-02-28 22:45:39
【问题描述】:

我有以下场景,我正在 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&lt;T&gt; 对象可以如下所示:

const options: RemoteOptions<RootState> = {
    users: {
        fetchResource: (userId: number) => 'this is NOT strictly checked'
    },
    someNestedSection: {
        currentUserAccount: {
            fetchResource: () => new Account(/* some data from server */)
        }
    }
}

我的RemoteOptions&lt;T&gt; 定义为几乎所有内容提供了很好的类型检查,它强制RemoteOptions&lt;RootState&gt; 对象只包含RootState 具有的那些属性(包括嵌套的属性),它甚至能够强制执行(如果没有@987654328 @ 在返回类型上)fetchResourceoptions.someNestedSection.currentUserAccount 上的函数只返回Account 对象,但我不知道如何在options.users.fetchResource 上强制执行User 返回值。 问题在于fetchResource: (queryData?: any) =&gt; T[K]|any 的返回类型,我在那里有any,我需要用memberof T[K] 之类的东西替换any,但我不知道它应该是什么(没有memberof 运算符在 TypeScript 中,只有 keyof,但不适用于这种情况)。

有人知道吗?

【问题讨论】:

    标签: typescript vuex


    【解决方案1】:

    好的,我已经解决了这个问题:)

    新定义是:

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

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

    而且它似乎有效。我希望这是正确的方法,如果不是,我将不胜感激,如果有人能指出来。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2012-02-08
      • 2017-06-11
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多