如何在typescript项目中使用webdirverio,或者请提供如何引用导入包中定义的类型的高级概述



这是我一直在处理的特殊情况

  • 我正在尝试创建一个用于网站端到端测试的私有npm包。

  • 我需要使用webdriverio包。

  • 我希望用户能够用提供的配置启动我的可执行文件,这个配置的一部分必须是webdriverio配置(实际上是它的一个子集,因为我想限制一些选项)。配置的另一部分与我的包有关:用户登录名等。

为了实现这一点,我声明了自己的类型,并期望用户的参数符合它。

但问题是,当我试图编译声明该类型的代码时,我得到如下错误:

Argument of type '{ … } is not assignable to parameter of type 'RemoteOptions'

Types of property 'logLevel' are incompatible

Type 'string' is not assignable to type 'WebDriverLogTypes | undefined'.

声明该类型的代码是(我留下注释只是为了演示我试图修复这个问题的尝试):

//import { WebdriverIO } from '@wdio/types';
type TestUserConfig = {
//wdioConfig: WebdriverIO,
wdioConfig: {
path: '/wd/hub',
automationProtocol: 'webdriver',
//logLevel: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent',
logLevel: string,
waitforTimeout: number,
capabilities: {
browserName: 'chrome',
},
},
domain: string,
userLogin: string,
userPassword: string,
googleAuthSecret: string,
expectedRole: string,
}
export type {
TestUserConfig,
}

问题是,如果我试图直接引用这些webdriverio类型,如:

logLevel: WebDriverLogTypes,

我得到Cannot find name 'WebDriverLogTypes'

这样的错误如果我想导入这个类型,比如:

import {WebDriverLogTypes} from '@wdio/types';
Module '"@wdio/types"' has no exported member 'WebDriverLogTypes'

原题:

假设有一个nodejs包(我不会叫它模块,因为我的意思是一个模块,但不是我的模块,这是在我的控制下,而是通过npm安装的模块)。该包导出一个函数,该函数需要特定类型作为其参数:

type Foo = 'foo';
export default function otherModule(arg: Foo) {}

现在,当我使用这个模块时,我希望typescript能够正确捕获类型错误,以便尝试编译这个typescript代码时会抛出错误:

import otherModule from 'other-module';
otherModule('bar');

实现这一目标的普遍接受(可能是最好的)方法是什么?


我看到一些包也有'@types/*'包,但我还不知道如何使用它们。

为其他导入库/包等使用类型的通用方法:

如果导入的库是用JavaScript开发的,它很可能没有任何现成的类型定义,所以在这种情况下,只有这些解决方案:

  • 检查这个库是否有类型定义(通常可能是'@types/{libraryName}'包或其他东西,如果它在库文档中提供的话。
  • 为这个库创建一个类型声明:参见TypeScript文档中的Ambient声明。

然后导入该声明并使用它来引用该库中的类型。


对于我的webdriverio的具体情况,我已经结束了下一个解决方案。

由于webdriverio显然是用TypeScript开发的,所以它已经有了自己的类型声明。

所以我只是查看了@wdio/types包,看看WebDriverLogTypes类型在哪里被声明,并使用该命名空间来引用该类型:

import type { Options } from '@wdio/types';
type TestUserConfig = {
wdioConfig: {
path: '/wd/hub',
automationProtocol: 'webdriver',
logLevel: Options.WebDriverLogTypes,
waitforTimeout: number,
capabilities: {
browserName: 'chrome',
},
},
domain: string,
userLogin: string,
userPassword: string,
googleAuthSecret: string,
expectedRole: string,
}
export type {
TestUserConfig,
}

相关内容

  • 没有找到相关文章

最新更新