ฉันเป็นผู้เริ่มต้นใช้งาน typescript โดยสมบูรณ์และฉันสงสัยว่าจะสามารถใช้สัญญา ES6 ใน typescript ได้หรือไม่และฉันจะต้องทำอย่างไรเพื่อให้มันใช้งานได้ ฉันกำลังใช้งานโหนด 0.11.14 และได้รับข้อผิดพลาดระหว่างการรวบรวม "ไม่พบชื่อ 'สัญญา'"
ฉันเป็นผู้เริ่มต้นใช้งาน typescript โดยสมบูรณ์และฉันสงสัยว่าจะสามารถใช้สัญญา ES6 ใน typescript ได้หรือไม่และฉันจะต้องทำอย่างไรเพื่อให้มันใช้งานได้ ฉันกำลังใช้งานโหนด 0.11.14 และได้รับข้อผิดพลาดระหว่างการรวบรวม "ไม่พบชื่อ 'สัญญา'"
คำตอบ:
lib.d.ts ปัจจุบันไม่มีสัญญาที่กำหนดไว้ดังนั้นคุณต้องมีไฟล์นิยามพิเศษสำหรับมันนั่นคือสาเหตุที่คุณได้รับข้อผิดพลาดในการคอมไพล์
ตัวอย่างเช่นคุณสามารถใช้ (เช่น @elclanrs กล่าวว่า) ใช้แพ็คเกจ es6 กับไฟล์คำจำกัดความจากDefinelyTyped : คำจำกัดความ es6
จากนั้นคุณสามารถใช้งานได้ดังนี้:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
แก้ไขคุณสามารถใช้งานได้โดยไม่ต้องกำหนดเป้าหมายเมื่อกำหนดเป้าหมาย ES6 (ด้วยคอมไพเลอร์ TypeScript) - โปรดทราบว่าคุณยังต้องการให้ Promise มีอยู่ในรันไทม์ของหลักสูตร (ดังนั้นจะใช้ไม่ได้ในเบราว์เซอร์เก่า :)) เพิ่ม / แก้ไขสิ่งต่อไปนี้ในtsconfig.json
:
"compilerOptions": {
"target": "ES6"
}
แก้ไข 2 เมื่อ TypeScript 2.0 ออกมาสิ่งต่างๆจะเปลี่ยนไปเล็กน้อย (แม้ว่าข้างบนจะยังใช้งานได้) แต่ไฟล์นิยามสามารถติดตั้งได้โดยตรงกับ npm ดังต่อไปนี้:
npm install --save @types/es6-promise
- แหล่งที่มา
edit3 อัปเดตคำตอบพร้อมข้อมูลเพิ่มเติมสำหรับการใช้ประเภท
สร้างpackage.json
ไฟล์ที่มีเฉพาะ{ }
เป็นเนื้อหา (หากคุณยังไม่มี package.json อยู่แล้วให้เรียกnpm install --save @types/es6-promise
และtsc --init
คำสั่งติดตั้ง npm แรกจะเปลี่ยนของคุณpackage.json
เพื่อรวม es6-สัญญาเป็นการอ้างอิง tsc --init จะสร้างtsconfig.json
ไฟล์ สำหรับคุณ.
ตอนนี้คุณสามารถใช้สัญญาในไฟล์ typescript ของคุณvar x: Promise<any>;
ได้แล้ว ดำเนินการtsc -p .
เพื่อรวบรวมโครงการของคุณ คุณไม่ควรมีข้อผิดพลาด
--save-dev
ควรใช้แฟล็กแทน--save
เนื่องจากไลบรารีใช้ในเวลาคอมไพล์เท่านั้น
ใช้ตัวเลือกtarget
และlib
คอมไพเลอร์เพื่อคอมไพล์โดยตรงes5
โดยไม่จำเป็นต้องติดตั้งไฟล์es6-shim
. (ทดสอบด้วย TypeScript 2.1.4
) ในส่วน lib ให้ใช้อย่างใดอย่างหนึ่งes2016
หรือes2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
ใช้ในการติดตั้ง NPMes6-shim
จากองค์กรประเภท
npm install @types/es6-shim --save-dev
ก่อน typescript 2.0 ใช้typingsการติดตั้งes6-shim
ทั่วโลกจากDefinitelyTyped
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
typings
ตัวเลือกที่ใช้npm
ในการติดตั้งtypings
ทั่วโลกแล้วใช้typings
ในการติดตั้งชิม dt~
คำนำหน้าหมายถึงการดาวน์โหลดชิมจาก DefinitelyTyped --global
ตัวเลือกหมายความว่าประเภทชิมที่จะสามารถใช้ได้ตลอดโครงการ
https://github.com/Microsoft/TypeScript/issues/7788 - ไม่พบชื่อ 'Promise' & ไม่พบชื่อ 'ต้องการ'
es2016
ไม่ใช่ความคิดที่ดีเว้นแต่ว่าเป้าหมายของคุณจะรองรับ ES2016 มีเบราว์เซอร์จำนวนมากที่รองรับคำสัญญา แต่ไม่ใช่ทุกอย่างใน ES2016 ใช้es2015.promise
เพื่อรวมเฉพาะประเภทสำหรับสัญญาโดยไม่ต้องดึงประเภทสำหรับทุกอย่างใน ES2016
ใน TypeScript 2.0 คุณสามารถรวมการพิมพ์สำหรับคำสัญญาดั้งเดิมโดยรวมสิ่งต่อไปนี้ไว้ในไฟล์ tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
ซึ่งจะรวมถึงการประกาศสัญญาที่มาพร้อมกับ TypeScript โดยไม่ต้องตั้งเป้าหมายเป็น ES6
หากคุณใช้ node.js 0.12 ขึ้นไป / typescript 1.4 ขึ้นไปให้เพิ่มตัวเลือกคอมไพเลอร์เช่น:
tsc a.ts --target es6 --module commonjs
ข้อมูลเพิ่มเติม: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options
หากคุณใช้tsconfig.json
แล้วจะเป็นดังนี้:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
}
}
ข้อมูลเพิ่มเติม: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json
นี่เป็นวิธีล่าสุดในการทำเช่นนี้คำตอบข้างต้นล้าสมัย:
typings install --global es6-promise
ไม่จำเป็นต้องติดตั้ง npm เนื่องจาก ES6 Promises เป็นแบบเนทีฟ
โครงการ Node.js -> คุณสมบัติ -> แท็บการสร้าง typescript เวอร์ชัน ECMAScript = ECMAScript6
import http = require('http');
import fs = require('fs');
function findFolderAsync(directory : string): Promise<string> {
let p = new Promise<string>(function (resolve, reject) {
fs.stat(directory, function (err, stats) {
//Check if error defined and the error code is "not exists"
if (err && err.code === "ENOENT") {
reject("Directory does not exist");
}
else {
resolve("Directory exists");
}
});
});
return p;
}
findFolderAsync("myFolder").then(
function (msg : string) {
console.log("Promise resolved as " + msg);
},
function (msg : string) {
console.log("Promise rejected as " + msg);
}
);
A. หากใช้"target": "es5"
และ TypeScript เวอร์ชันต่ำกว่า 2.0:
typings install es6-promise --save --global --source dt
B. หากใช้"target": "es5"
และ TypeScript เวอร์ชัน 2.0 หรือสูงกว่า:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
C. ถ้าใช้"target": "es6"
ก็ไม่ต้องทำอะไร
"target": "es6"
กับ typescript 2.1.1 Cannot find name 'Promise'
และฉันยังคงได้รับ
ฉันต้องดาวน์เกรด@types/core-js
เป็น 9.36 เพื่อให้มันทำงานกับ"target": "es5"
set ใน tsconfig ของฉัน
"@types/core-js": "0.9.36",
es6-promise