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
