svaga referenser - Hur använder man WeakRef i Typescript?


Jag vill använda WeakRef i Typescript. Jag försökte använda den senaste tillgängliga versionen för tillfället (4.1.5). Jag har ett kompileringsfel:

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>();
}

Jag har kompileringsfel.

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>();
                                  ~~~~~~~

Men detta är ECMAScript 2021. Chrome 88 verkar förstå det. Jag har node 15.8.0 (den senaste). Har du någon idé om hur man får Typescript att förstå WeakRef?

Svar #1

Den 18 februari 2021, för att kunna använda WeakRef i TypeScript, behöver du ha och konfigurera tsconfig.json genom att lägga till ESNext i lib-egenskapen.

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

Svar #2

Ett mer nyanserat alternativ är att uttryckligen inkludera ES2021.WeakRef i tsconfig.json lib.

{
    "compilerOptions": {
        "lib": ["ES2020", "ES2021.WeakRef"],
        // ...
    },
    // ...
}

Notera:

  • ES2020 är lib-inställningen för Node 14.
  • ES2021 är lib-inställningen för Node 16.
  • ES2022 är lib-inställningen för Node 18.

Se: tsconfig/bases: Värdar TSConfigs att utöka i en TypeScript-app, anpassad till en viss körningsmiljö

Relaterade artiklar