この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
yarnで依存モジュールを管理しているプロジェクトで、とある型定義モジュール(@typed/module_name)のバージョンを上げたのですが、型定義モジュールの依存モジュールのバージョンが上がらず、tscでエラーになる事象に遭遇したので原因と対処をまとめておきます。
環境
- yarn: 1.19.1
- tsc: 3.7.2
再現方法
package.json
に以下の2つの型定義モジュールが記述されているとします。
"devDependencies": {
"@types/a": "1.0.0",
"@types/b": "1.0.0",
}
@types/a
の依存モジュールはありません。@types/b
の依存モジュールは@types/a
です。
このとき、 @types/a
の 1.0.1
と、 @types/b
の 1.0.1
がリリースされました。 そして、 @types/b
の 1.0.1
は @types/a
の 1.0.1
に依存しています。
そこで、 package.json
を以下のように書き換えて yarn
を実行します。
"devDependencies": {
"@types/a": "1.0.1",
"@types/b": "1.0.1",
}
すると、 tsc
を実行したときにエラーが起きるようになります。
原因
型定義モジュールの、依存モジュールのバージョンが指定されていないため。
そもそも、型定義モジュールの package.json
は、 microsoft/types-publisher が動的に生成します。このとき、依存モジュールのバージョンは *
として生成されます。
この状態で、再現方法の最初の package.json
の状態で yarn
を実行すると、 yarn.lock
ファイルは以下のようになります。
"@types/a@*", "@types/a@1.0.0":
version "1.0.0"
"@types/b@1.0.0":
version "1.0.0"
dependencies:
"@types/a@" "*"
そして、再現方法の2番めの package.json
の状態で yarn
を実行すると、 yarn.lock
ファイルは以下のように更新されます。
"@types/a@*":
version "1.0.0"
"@types/a@1.0.1":
version "1.0.1"
"@types/b@1.0.1":
version "1.0.1"
dependencies:
"@types/a@" "*"
"@types/b@1.0.1"
が依存する "@types/a@" "*"
のバージョンが、 1.0.0
のままであることがお分かりいただけるかと思います。
この問題は、かなり前から 指摘されている のですが、解決されていません。そもそも依存モジュールを動的に検出しているのでバージョンの指定は不可能なように思います。また、型定義モジュールに package.json
を含めることはできますが @types
以外のパッケージとREADMEにて説明されています。
A package.json may be included to specify dependencies that are not other @types packages.
対処
原因は yarn.lock
に記録されるバージョンのズレが問題なので、該当箇所の記述(上記の例では "@types/a@*"
の部分)を削除してから、
"@types/a@*": # ここを消す
version "1.0.0"
"@types/a@1.0.1":
version "1.0.1"
"@types/b@1.0.1":
version "1.0.1"
dependencies:
"@types/a@" "*"
再度 yarn
を実行すると以下のようになり問題が解決します。
"@types/a@*", "@types/a@1.0.1":
version "1.0.1"
"@types/b@1.0.1":
version "1.0.1"
dependencies:
"@types/a@" "*"
別の対処
tsconfig.json
の設定で skipLibCheck: true
をすると型定義ファイル( *.d.ts
)の型チェックがスキップされます。
まとめ
依存モジュールの依存モジュールがおかしい時は yarn.lock
を確認しましょう!