语境
Yarn工作区提供了一种方便的方式来依赖单存储库中的包。当包 A 依赖包 B 时,包 B 中定义的接口等在包 A 中得到适当的解析。
问题
我面临一个问题,如果包 B 依赖于外部库,但该外部库缺少类型,因此包 B 创建了自己的some-library.d.ts
文件。使用tslint
lint 包 A 时,此自定义定义文件会正确解析包 B 中的表达式,但不适用于包 A 中使用包 B 中的类型的表达式。
我在这里推送了这个问题的简化示例:
https://github.com/tommedema/tslint-yarn-workspaces
它的核心如下。
包/a/src/index.ts
// tslint:disable:no-console
import { someDependedFn } from 'b'
export const someDependingFn = (): void => {
const someNr = someDependedFn('pascal-case-me')
console.log(someNr)
}
包/b/src/index.ts
import camelCase from 'camelcase'
export const someDependedFn = (str: string): string => {
const camelStr = camelCase(str, { pascalCase: true })
return camelStr
}
包/b/src/typings/camelcase/index.d.ts
// Type definitions for camelcase 5.0
// Project: https://github.com/sindresorhus/camelcase
// tslint:disable only-arrow-functions completed-docs
declare module 'camelcase' {
export default function camelCase(
strs: string | string[],
options: {
pascalCase?: boolean
}
): string
}
现在,如果您将目录更改为 packagea
并运行yarn build
,它工作得很好。但是如果你运行yarn lint
,它会抛出:
$ tslint -p tsconfig.json
ERROR: packages/b/src/index.ts[4, 20]: Unsafe use of expression of type 'any'.
ERROR: packages/b/src/index.ts[6, 10]: Unsafe use of expression of type 'any'.
TSLint 无法识别包 B 所依赖的类型,但它只会在从包 A 运行 tslint 时抱怨这一点(不是预期的)。在包 B 中,tslint 没有抱怨(如预期的那样)。
问题
当然,我可以手动添加camelcase
包 A 内部的类型,但这似乎明显违反了关注点分离:包 A 不应该知道包 B 依赖于包 camelcase 或 X 或 Y。它只应该了解包 B 的公共 API,即dependedFn
.
如何设置 tslint 以便在使用纱线工作区时正确解析这些间接类型定义?