typescript - Angular 2 ไม่สามารถหาไฟล์ชื่อ 'Set'
ปัจจุบัน ฉันกำลังอัปเดตโครงการของฉันจาก angular2 beta15 เป็น rc4 เมื่อฉันกำลังคอมไพล์ ฉันได้รับข้อผิดพลาด:
path/node_modules/@angular/common/src/directives/ng_class.d.ts(81,35): ข้อผิดพลาด TS2304: ไม่สามารถหาชื่อ 'Set' ได้.
ไฟล์ tsconfig.json ของฉันมีลักษณะดังนี้:
{
"compilerOptions": {
"target": "ES5",
"module": "commonjs",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"moduleResolution": "node",
"removeComments": false,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": false,
"declaration": true,
"outDir": "tmp/app"
},
"exclude": [
"node_modules",
"dist",
"tmp"
]
}
ใน main.ts ฉันก็ได้รวมเอาไว้ด้วย:
/// <reference path="../typings/index.d.ts" />
/// <reference path="../typings/tsd.d.ts"/>
และ typings.json:
{
"name": "my-project",
"dependencies": {},
"globalDependencies": {
"core-js": "registry:dt/core-js#0.0.0+20160602141332",
"jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
"node": "registry:dt/node#6.0.0+20160621231320",
"moment": "registry:dt/moment#2.8.0+20160316155526",
"moment-node": "registry:dt/moment-node#2.11.1+20160329220348",
"es6-shim": "registry:dt/es6-shim#0.31.2+20160317120654"
}
}
ข้อผิดพลาดนี้หายไปเมื่อฉันเปลี่ยน "target": "ES5" เป็น "ES6" ใน tsconfig.json แต่ฉันจำเป็นต้องใช้ ES5 ฉันสันนิษฐานว่าปัญหาเกิดขึ้นเมื่อฉันไม่รวม /// อย่างไรก็ตาม ตาม https://github.com/typings/typings/issues/151 เราสามารถใช้ typings/index.d.ts แทนได้
คุณช่วยแชร์ความคิดเห็นของคุณเพื่อแก้ไขปัญหานี้ได้ไหม? ขอบคุณมากล่วงหน้าครับ/ค่ะ
คำตอบ #1
ฉันคิดว่า Set ถูกจัดเตรียมโดย polyfill สำหรับ ES6 Angular2 แนะนำให้ใช้ core-js สำหรับสิ่งนี้ (ดูที่ https://angular.io/guide/quickstart):
เราจะเริ่มด้วย shim ของ core-js สำหรับ ES2015/ES6 ซึ่งปรับแต่งบริบททั่วโลก (window) ด้วยคุณสมบัติสำคัญของ ES2015 (ES6)
คุณสามารถระบุได้ภายในไฟล์ typings.json ของคุณ แต่คุณจำเป็นต้องติดตั้ง typings โดยใช้คำสั่ง typings install.
คำตอบ #2
ฉันพบข้อผิดพลาดนี้ขณะพยายามเรียกใช้แอปพลิเคชันสาธิต คล้ายกับประสบการณ์ของคุณ หากฉันเปลี่ยนเป้าหมายเป็น "es6" ในไฟล์ tsconfig.json ของฉัน ฉันก็ไม่มีปัญหา หลังจากเรียกใช้แอปพลิเคชัน Angular 2 Quick Start ซึ่งทำงานได้ ฉันเริ่มเปรียบเทียบความแตกต่างในไฟล์ tsconfig.json ของฉัน สุดท้ายก็พบว่ามีบรรทัดเดียวที่ฉันขาดหายไปในไฟล์ tsconfig.json ของฉัน:
"lib": ["es2015", "dom"]
หลังจากเพิ่มบรรทัดนั้นลงในไฟล์ tsconfig.json ของฉัน ข้อผิดพลาดก็ได้รับการแก้ไข นี่คือสิ่งที่ฉันพบในเอกสารการกำหนดค่า Angular Typescript เกี่ยวกับบรรทัดนั้น:
lib.d.ts
TypeScript มีไฟล์ประกาศพิเศษที่เรียกว่า lib.d.ts ไฟล์นี้ประกอบด้วยการประกาศแบบแอบเบียนท์สำหรับโครงสร้าง JavaScript ทั่วไปต่างๆ ที่มีอยู่ในรันไทม์ของ JavaScript และ DOM
ขึ้นอยู่กับ --target, TypeScript จะเพิ่มการประกาศแวดล้อมเพิ่มเติม เช่น Promise หาก target ของเราคือ es6
เนื่องจาก QuickStart กำหนดเป้าหมายไปที่ es5 เราจึงสามารถเขียนทับรายการของไฟล์ประกาศที่จะรวมได้:
"lib": ["es2015", "dom"]
ด้วยเหตุนี้ เราจึงมีการพิมพ์ชนิดของ es6 ทั้งหมดแม้เมื่อกำหนดเป้าหมายเป็น es5
https://angular.io/docs/ts/latest/guide/typescript-configuration.html
