-
-
Notifications
You must be signed in to change notification settings - Fork 29
ESNext.Disposable in tsconfig lib exposes APIs unavailable on supported Node.js versions #772
Copy link
Copy link
Open
Description
現時点で実害はないのですが、気づいたことの情報共有です。tsconfig.jsonのlibにESNext.Disposableが含まれていますが、このlibが提供する型の一部はpackage.jsonのengines (^20.0.0 || >=22.0.0)でサポートされているNode.jsバージョンには存在せず、厳密には互換性がありません。ランタイムで失敗するコードが型チェックを通ってしまっている状況です。
| 20 | 22 | 23 | 24+ | |
|---|---|---|---|---|
Symbol.dispose |
ok | ok | ok | ok |
Symbol.asyncDispose |
ok | ok | ok | ok |
DisposableStack |
x | x | x | ok |
AsyncDisposableStack |
x | x | x | ok |
SuppressedError |
x | x | x | ok |
たとえばindex.tsに以下のような関数を追加してもビルドは通りますが、Node.js 22で実行するとReferenceError: DisposableStack is not definedが発生します。
export function doNothing() {
using stack = new DisposableStack();
stack.use({ [Symbol.dispose]() { console.error("logging") } });
}すでにusingを活用しているため、単にESNext.Disposableを削除すると既存のコードが通らなくなります。以下のように自前で型だけ通す必要がありそうです。ですがこれはTypeScriptが提供するものの劣化コピーになるので、達成できる開発時の安全性と比べて割には合わないかと思っています。
interface SymbolConstructor {
readonly dispose: unique symbol;
readonly asyncDispose: unique symbol;
}
interface Disposable {
[Symbol.dispose](): void;
}
interface AsyncDisposable {
[Symbol.asyncDispose](): PromiseLike<void>;
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels