typescript - 處理在生成的 .d.ts 文件中來自可選依賴的類型
我有一個函式庫,其中一些檔案使用了在 peerDependencies 中聲明的可選依賴,而使用該函式庫的應用程式必須自行包含相應的依賴項,如果它想使用函式庫的某些組件。這樣是可行的,但在一個不使用那些函式庫部分的應用程式中,我會在函式庫的 .d.ts 檔案中收到錯誤,因為這些檔案中導入了可選依賴的類型,而這些依賴現在並不存在於 node_modules 路徑中。
如果我在 tsconfig.json 中使用 skipLibCheck,錯誤就消失了,但我不完全確定跳過庫檢查會帶來哪些其他後果。有沒有其他方法,可以讓我的庫去除可選第三方庫的導出類型,或者在應用程式中使用某些編譯器選項,不完全跳過庫檢查,但忽略 .d.ts 文件中的導入錯誤,例如將缺失的類型視為 any?
範例設定:
my-optional-dependency 模組:
index.ts:
export class Foo {
constructor(readonly value: string) {
}
}
my-library 模組:
package.json:
devDependencies: {
"my-optional-dependency": "^1.0.0"
},
peerDependencies: {
"my-optional-dependency": "^1.0.0"
}
index.ts:
import {Foo} from 'optional-dependency';
export function hello() {
console.log('Hello, world!');
}
export async function wtf(value: string): Foo {
const {Foo} = await import('my-optional-dependency');
return new Foo(value);
}
my-app 模組:
package.json:
dependencies: {
"my-library": "^1.0.0",
"my-optional-dependency": "^1.0.0"
}
index.ts:
import {wtf} from 'my-library';
async function foo() {
const foo = await wtf('This works');
}
my-other-app 模組:
package.json:
dependencies: {
"my-library": "^1.0.0"
}
index.ts:
import {hello} from 'my-library';
hello();
兩個應用程式都可以運行,如果使用像 webpack 這樣的工具,程式碼可以無錯誤地打包。可選的依賴僅在 wtf 函數內動態導入,所以當 node_modules 中沒有 my-optional-dependency 時,my-other-app 不會出現任何錯誤。
但是,使用純 tsc 編譯而不加 skipLibCheck 將會產生:
node_modules/my-library/dist/index.d.ts:1:19 - error TS2307: Cannot find module 'my-optional-dependencies' or its corresponding type declarations.
1 import {Foo} from 'optional-dependency';
~~~~~~~~~~~~~~~~~~~~~
我在某處讀到關於可選依賴的資訊,說編譯器會將缺失的類型視為 any,這對我在這裡來說很合適。但我如何在不使用 skipLibCheck 的情況下做到這一點呢?如果我完全從 wtf 中移除對 Foo 的類型依賴,我就無法再獲得類型安全的 wtf 函數。此外,我也不想把庫的可選部分放在子路徑中,以便使用 my-library/dist/optional 或類似方式導入。
這裡有好的解決方案嗎?