javascript - Egenskapen "at" finns inte på Array


Enligt MDN Web Docs Array.prototype#at är en giltig metod. Men av vissa anledningar vägrar TypeScript att kompilera och säger att den inte existerar.

public at(index: number): V {
  index = Math.floor(index);
  const arr = [...this.values()];
  return arr.at(index);
}

Konsolutdata från tsc:

Jag kan inte använda klammernotation, eftersom metoden är avsedd att kunna hantera negativa nummer. Jag har försökt många saker, inklusive att sätta target i tsconfig.json-filen till ESNext, ES2021 och ES6, men utan framgång. lib-alternativet hjälper inte heller.

json

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2021",
    "outDir": "./dist",
    "declaration": true,
    "declarationDir": "./typings",
    "lib": ["ES2021", "ESNext"]
  }
}

Vad kan jag göra? Gör jag något fel?

Svar #1

Enligt MDN Web Docs Array.prototype#at är en giltig metod.

MDN får inte bestämma vad som är en del av TypeScript och vad som inte är det. Det är TypeScript-utvecklarna som gör det.

Om MDN säger att något är en "giltig metod" är relevant för Mozilla, och endast Mozilla, men har ingen betydelse för TypeScript.

Men av någon anledning vägrar TypeScript att kompilera och säger att det inte existerar.

Det beror på att metoden inte finns i någon ECMAScript-version som stöds av TypeScript.

Jag har provat många saker, inklusive att sätta target i tsconfig.json-filen till ESNext, ES2021 och ES6, men utan framgång.

Det beror på att metoden inte existerar i varken ECMAScript 6 eller ECMAScript 2021. Den finns i ES2022 (vilket är vad ESNext är för tillfället), men den lades till först för åtta veckor sedan, och alltså efter att TypeScript 4.4 slutfördes (och möjligen också för sent för TypeScript 4.5).

Alternativet lib hjälper inte heller.

Återigen, det beror på att metoden inte existerar i någon biblioteksversion som för närvarande stöds av TypeScript.

Även i den nuvarande main-grenen, som kommer att bli TypeScript 4.6, motsvarar lib/lib.esnext.d.ts endast ECMAScript 2021 + de senaste Internationalization-tilläggen.

Vad kan jag göra? Gör jag något fel?

Du kan vänta tills metoden faktiskt blir en del av en släppt version av ECMAScript och/eller TypeScript.

Svar #2

Array#at är faktiskt en ny metod som endast är tillgänglig i ESNext eller genom att använda en polyfill. Om du använder det senare kan du helt enkelt utöka det globala array-gränssnittet på detta sätt:

declare global {         
   interface Array<T> {                     
      at(index: number): T;
   }
}

Relaterade artiklar