如何在 Typescript 中使用 Wea​​kRef?

jlg*_*ego 11 weak-references typescript

我想在 Typescript 中使用 Wea​​kRef。我尝试使用目前可用的最后一个版本(4.1.5)。我有一个编译错误:

const toIdString = (o: Object): string =>
  o.constructor.name + JSON.stringify(o);

export class MemoCache {
  static handle<T>(o: T): T {
    const id = toIdString(o);
    const cached = MemoCache.map.get(id);
    if (cached) {
      return cached.deref() as T;
    }
    MemoCache.map.set(id, new WeakRef(o));
    return o;
  }

  static map = new Map<string, WeakRef>();
}
Run Code Online (Sandbox Code Playgroud)

我有编译错误。


src/Memoizer.ts:11:31 - error TS2304: Cannot find name 'WeakRef'.

11     MemoCache.map.set(id, new WeakRef(o));
                                 ~~~~~~~

src/Memoizer.ts:15:32 - error TS2304: Cannot find name 'WeakRef'.

15   static map = new Map<string, WeakRef>();
                                  ~~~~~~~

Run Code Online (Sandbox Code Playgroud)

然而,这是 ECMAScript 2021。Chrome 88 似乎能理解它。我有节点 15.8.0 (最后一个)你知道如何让 Typescript 理解 WeakRef 吗?

jlg*_*ego 13

2021年2月18日,为了WeakRef在Typsecript中使用,您需要tsconfig.json通过添加ESNext属性来进行配置lib

{
  "compilerOptions": {
// ...
    "lib": ["ESNext"],
// ...
  },
// ...
}

Run Code Online (Sandbox Code Playgroud)


小智 9

更细致的选项是显式包含ES2021.WeakReftsconfig.json lib.

{
    "compilerOptions": {
        "lib": ["ES2020", "ES2021.WeakRef"],
        // ...
    },
    // ...
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • ES2020是 Node 14 的 lib 设置。
  • ES2021是 Node 16 的 lib 设置。
  • ES2022是 Node 18 的 lib 设置。

请参阅:tsconfig/bases:托管 TSConfig 以在 TypeScript 应用程序中扩展,并调整到特定的运行时环境