ค้นหาเว็บไซต์

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