【发布时间】:2018-07-19 19:36:09
【问题描述】:
上下文
Yarn workspaces 提供了一种方便的方式来依赖单仓库中的包。当包 A 依赖包 B 时,包 B 中定义的接口等在包 A 中得到适当的解析。
问题
我面临一个问题,如果包 B 依赖于外部库,但该外部库缺少类型,因此包 B 创建了自己的 some-library.d.ts 文件。当使用tslint 对包 A 进行 lint 处理时,此自定义定义文件可以正确解析包 B 中的表达式,但不适用于包 A 中使用包 B 中的类型的表达式。
我在这里推送了这个问题的简化示例:
https://github.com/tommedema/tslint-yarn-workspaces
其核心如下。
packages/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)
}
packages/b/src/index.ts
import camelCase from 'camelcase'
export const someDependedFn = (str: string): string => {
const camelStr = camelCase(str, { pascalCase: true })
return camelStr
}
packages/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
}
现在,如果您将目录更改为包a 并运行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 没有抱怨(如预期的那样)。
问题
当然,我可以在包 A 中手动添加 camelcase 的类型,但这似乎明显违反了关注点分离:包 A 不应该知道包 B 依赖于包 camelcase,或者 X 或 Y . 它应该只知道包B的公共API,即dependedFn。
如何设置 tslint 以便在使用 yarn 工作区时正确解析这些间接类型定义?
【问题讨论】:
标签: typescript yarnpkg tslint yarn-workspaces