javascript - Klargörande om funktionaliteten hos Typescripts target- och lib-inställningar


När tsconfig.json har följande

"target": "es5",
"lib": [ "es6", "dom", "es2017" ]

det verkar inte konvertera es2017-konstruktioner till es5. Till exempel kommer följande att misslyckas på IE11:

var foo = [1, 2, 3].includes(1);

Är detta avsiktligt eller missar jag en inställning i tsconfig.json?

Svar #1

Klargörande om funktionaliteten i Typescripts inställningar för target och lib

Det förenklade sättet jag tänker på det är att target säger vilken syntax utdata-JavaScript kommer att ha, och lib säger vilka API-medlemmar din TypeScript-källkod kan använda. Det finns mer detaljer i svaren på dessa två frågor:

  • Typescript- Vad är target i tsconfig?
  • Vad gör tsconfig-alternativet "lib"?

...det verkar inte konvertera es2017-konstruktioner till es5... Är detta avsiktligt eller saknar jag en inställning i tsconfig.json?

Du har rätt. Detta är avsiktligt. TypeScript transpilerar till target-syntaxen; den polyfyller inte API-medlemmarna som saknas från target. Här är ett citat från en kärnmedlem i TypeScript-teamet:

Jag tror att du förväxlar transpilation med automatisk polyfilling. TypeScript fyller inte automatiskt i polyfills åt dig som Babel gör, men utför syntaktisk nedgradering (t.ex. för pilfunktioner). Om du vill använda ES6 runtime-prototypmetoder skulle jag helt enkelt inkludera en lämplig ES6-polyfill och dess tillhörande definitionsfil.

Om ditt lib innehåller API-medlemmar (såsom Array.prototype.include) som inte finns i target-körtiden, behöver du installera polyfills som tillhandahåller dessa API-medlemmar.

Svar #2

Du kan se listan Webbläsarkompatibilitet för includes-metoden här.

I detta stödde det inte IE.

https://developer.mozilla.org/sv/docs/Web/JavaScript/Reference/Global_Objects/String/includes