Контекст
рабочие области Yarn предоставляют удобный способ зависеть от пакетов в монорепозитории. Когда пакет A зависит от пакета B, интерфейсы и т. Д., Определенные в пакете B, соответствующим образом разрешаются в пакете A.
Проблема
Я столкнулся с проблемой, когда пакет B зависит от внешней библиотеки, но эта внешняя библиотека не имеет типизации, и поэтому пакет B создал свой собственный файл some-library.d.ts
. При использовании tslint
для линтинга пакета 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
}
Теперь, если вы измените каталог на пакет 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, но жалуется на это только при запуске tslint из пакета A (не ожидается). Внутри пакета B tslint не жалуется (как и ожидалось).
Вопрос
Конечно, я мог бы вручную добавить типизацию camelcase
внутри пакета A, но это кажется очевидным нарушением разделения ответственности: пакет A не должен знать, что пакет B зависит от пакета camelcase, X или Y. Это только предполагается. чтобы узнать об общедоступном API пакета B, то есть о dependedFn
.
Как я могу настроить tslint так, чтобы он правильно разрешал эти определения косвенной типизации при использовании рабочих пространств пряжи?