Typescript中的模块级别通用类型

时间:2019-08-23 09:30:05

标签: typescript cypress

不确定如何措辞,但我创建了一组自定义命令来处理赛普拉斯测试(https://github.com/svish/cypress-helper-redux/)中的Redux存储。该代码可以正常工作,但是我缺乏例如类型安全性商店状态。

我的应用程序代码中已经准备好类型,但是由于您如何添加自定义赛普拉斯帮助程序命令,尤其是它们的类型安全性,我不确定如何平稳地将它们“放入”依赖项代码。


这些命令本来只是常规功能,但是要使它们“进入”赛普拉斯可用命令链,基本上,您需要这样做:

具有功能

// cypress-helper-redux/src/redux.ts
import { Store, AnyAction } from 'redux';
import { STORE, ACTIONS } from './util';

export type Action = AnyAction;
export type ActionsCreators = any;
export type State = any;

export type Callback = (
  store: Store<State, Action>,
  actionCreators: ActionsCreators
) => void;

export default (callback: Callback): void => {
  const window = (cy as any).state('window');

  callback(window[STORE], window[ACTIONS]);
};

将自定义命令添加到赛普拉斯以使其可用

// cypress-helper-redux/src/index.ts

/// <reference path="./globals.ts"/>

import redux from './redux';

Cypress.Commands.add('redux', { prevSubject: false }, redux);

扩展赛普拉斯的链式键入以使命令“可见”并使用Typescript进行输入保护

// cypress-helper-redux/src/globals.ts
declare namespace Cypress {
  interface Chainable<Subject> {
    redux: typeof import('./redux').default;
  }
}

要在赛普拉斯设置中使用它,只需将以下内容添加到赛普拉斯支持文件中即可:

// cypress/support/index.ts
include 'cypress-helper-redux';

但是,如您所见,当包含此帮助器时,由于它们是编译时,因此无法为这些StateActionActionCreators分配类型类型声明,我也不可能通过某种函数来完成。

基本上我想我想要模块级的泛型或如何调用它。要进行import 'some-module';并以某种方式声明,无论该模块中使用了XY的哪个地方,都应将其替换为MyX和{{1} },并使其“正常工作”。在我的特定情况下,我想用应用程序特定商店设置中的类型覆盖MyYStateAction

这有可能吗?似乎有些人可以通过ActionCreators来完成这些工作,但并不能完全理解这些工作原理。

0 个答案:

没有答案