使用对象属性作为打字稿中的类型

时间:2018-10-06 13:21:03

标签: typescript

我有一个第三方代码段定义为

export const Actions = {
  findByIdAccessTokens: class implements Action {
            public readonly type = UserActionTypes.FIND_BY_ID_ACCESSTOKENS;
            public payload: { id: any; fk: any; customHeaders };

            constructor(
                id: any,
                fk: any,
                customHeaders?: Function,
                public meta?: any
            ) {
                this.payload = { id, fk, customHeaders };
            }
        },
}

在我的代码中,我想传递一个类型为findByIdAccessTokens的参数

但是,我似乎找不到一种能够告诉编译器我的参数属于该类型的方法

例如,

import { Actions,ActionTypes } from '@base/sdk/actions'; 
...
filter((action:Actions.findByIdAccessTokens) => 

给出错误[ts] Cannot find namespace 'Actions'.

我尝试了所有可以想到的组合,但不幸的是,我的Google搜索字词是如此通用(类,类型等),以至于我找不到解决问题的文章

我知道我是否定义并导出了一个类

export class findByIdAccessTokens implements Action {
        public readonly type = UserActionTypes.FIND_BY_ID_ACCESSTOKENS;
        public payload: { id: any; fk: any; customHeaders };

        constructor(
            id: any,
            fk: any,
            customHeaders?: Function,
            public meta?: any
        ) {
            this.payload = { id, fk, customHeaders };
        }
    },

然后直接导入,然后

import { updateByIdAccessTokensSuccess } from '@base/sdk/actions';
...
filter((action:findByIdAccessTokens) => 

编译得很好(以及类型安全性)

1 个答案:

答案 0 :(得分:1)

您可以使用类型查询来获取类,您已经很接近了,但是您需要使用typeof来获取常量的类型:

let findByIdAccessTokens: typeof Actions.findByIdAccessTokens; // findByIdAccessTokens is the class (not an instance of the class)
new findByIdAccessTokens(/*...*/ ) // Add parameters

如果您需要类的实例类型,则可以使用InstanceType条件类型

let findByIdAccessTokens!: InstanceType< typeof Actions.findByIdAccessTokens>; // findByIdAccessTokens is the instance of the class
findByIdAccessTokens.type // we can access properties