这是我一直在处理的特殊情况
-
我正在尝试创建一个用于网站端到端测试的私有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,
}