Skip to content

ESNext.Disposable in tsconfig lib exposes APIs unavailable on supported Node.js versions #772

@u1f992

Description

@u1f992

現時点で実害はないのですが、気づいたことの情報共有です。tsconfig.jsonのlibESNext.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>;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions