2015-04-13 24 views
38

Trước đây tôi có thể làm:cú pháp es6 mới cho nhập khẩu commonjs/amd module tức là 'nhập khẩu foo = require ('foo') `

import foo = require('foo'); 

Nhưng bây giờ mà nguyên cảo (1.5) hỗ trợ cú pháp mô-đun es6, những gì là cách chính xác để đạt được điều tương tự trong cú pháp mô-đun ES6.

+2

Có một cuộc thảo luận chi tiết ở đây http://www.2ality.com/2014/09/es6-modules-final.html – user5321531

Trả lời

70

Cách chính xác là tiếp tục sử dụng cú pháp nhập cũ. Cú pháp nhập mới chỉ dành cho các mô-đun ES, cú pháp nhập cũ là dành cho các mô-đun tiền ES6. Hai là khác biệt, cố ý như vậy. import * as foo from 'foo' nhập khẩu tất cả các thuộc tính của các mô-đun 'foo', nó không nhập giá trị mặc định như foo.

From the designer of the feature:

  • Một tuyên bố mặc định xuất khẩu luôn luôn tuyên bố một thành viên mang tên mặc định xuất khẩu và luôn phát ra như một bài tập để exports.default. Nói cách khác, export default luôn có ngữ nghĩa mô-đun ES. Để tương thích với Babel, chúng tôi có thể tùy chọn phát ra điểm đánh dấu __esModule khi mô-đun có xuất mặc định, nhưng chúng tôi sẽ không thực sự sử dụng điểm đánh dấu đó cho bất kỳ thứ gì.
  • Tuyên bố export =, thay thế một thực thể khác để được xuất khẩu thay cho chính mô-đun, luôn được phát ra dưới dạng nhiệm vụ cho module.exports. Đó là lỗi khi có các lần xuất khác trong mô-đun sử dụng export =. Đây là hành vi TypeScript hiện có.
  • Mô-đun sử dụng export = để xuất mô-đun khác (có thể nhập mô-đun bên trong hoặc bên ngoài) bằng cách sử dụng cấu trúc ES6 mới. Đặc biệt, nhập khẩu thuận tiện phá hoại có thể được sử dụng với các mô-đun như vậy. Mẫu sử dụng export = để xuất mô-đun khác là phổ biến trong các tệp .d.ts cung cấp chế độ xem CommonJS/AMD của mô-đun nội bộ (ví dụ: angular.d.ts).
  • Mô-đun sử dụng export = để xuất một thực thể không phải mô-đun thay cho chính mô-đun phải được nhập bằng cú pháp hiện tại import x = require("foo") như trường hợp hôm nay.

2016 update: Trình biên dịch nguyên cảo tại một số điểm bắt đầu cho phép import * as foo from 'legacy-module-foo' để có được việc nhập khẩu mặc định của một module di sản trong những hoàn cảnh nhất định. Điều này vi phạm đặc điểm kỹ thuật ES6 (§15.2.1.16, "Giá trị" * "cho biết yêu cầu nhập cho mô-đun đích là namespace object.”).

Khi module di sản bạn nhập theo cách này được cập nhật để ES6 mô-đun, các “mặc định” nhập khẩu cho những mô-đun sẽ ngừng làm việc (vì * as foo nhập khẩu là phải được nhập khẩu namespace đối tượng), có thể là vô cùng gây nhầm lẫn nếu bạn không biết rằng làm điều này là một lỗi TypeScript/SystemJS. Cũng có thể là việc sắp xếp lại TypeScript trong tương lai cho đặc tả ES sẽ khiến chúng phá vỡ. Vì vậy, có lẽ bạn nên tiếp tục sử dụng cú pháp nhập thừa được mô tả ở trên để tải các mô-đun cũ để tránh nhầm lẫn bản thân và các nhà phát triển khác làm việc trên mã của bạn về cách nhập không gian tên ES6 và tránh các thay đổi phá vỡ gây nhầm lẫn.

+2

Cảm ơn. Tôi đã yêu cầu làm rõ: https://github.com/Microsoft/TypeScript/issues/2242#issuecomment-92218146 – basarat

+0

Đây là lỗi thời, đúng không? Nếu tôi nhắm mục tiêu ES6, TS cho tôi biết rằng 'import x = require ('foo')' không được phép – JKillian

+2

Không, nó không lỗi thời. Không có cách nào để nhập một giá trị mặc định của một mô-đun phi ES6 với một ES6 'import' trong một mô-đun ES6 thực mà không vi phạm đặc tả EcmaScript. Nếu bạn muốn sử dụng các mô-đun kế thừa, bạn không thể nhắm vào môi trường ES6, vì trình biên dịch TypeScript phát ra các câu lệnh 'import' như trong trường hợp đó và đặc tả ES không có bất kỳ điều khoản nào cho các mô-đun CJS/AMD với mặc định xuất khẩu. –

8

Cú pháp tương ứng cho cú pháp mô-đun ES6 là:

import * as foo from 'foo'; 

Về cơ bản nhập khẩu tất cả mọi thứ từ các module foo vào một biến địa phương bằng tên của foo.

+4

Cú pháp xuất đi kèm với điều này là gì? Tôi nhận được 'giải quyết cho một thực thể không phải mô-đun và không thể được nhập khẩu bằng cách sử dụng cấu trúc này khi tôi đã thử chỉ' xuất {Output}; 'ở dưới cùng của tập tin cũ của tôi để thay thế' export = Output' – dcsan

+0

Tôi phải cảnh báo chống thay thế import name = require với import * như tên từ. Nếu mô-đun là một mô-đun ES6 trước, bạn sẽ gặp vấn đề. Nếu có một số mã khởi động khi mô-đun được yêu cầu, có thể không chạy với Loại bản ghi mới nhất. Tôi cũng đã trải qua các cảnh báo về kiểu chữ sau khi nâng cấp lên Typescript 2.0.3 và phải thay đổi việc nhập * của tôi thành phiên bản yêu cầu nhập. – user3717718

3

ES6 mô-đun có hiệu quả nguyên cảo module bên ngoài với một cú pháp mới: ES6 module được nạp riêng file video mà có thể nhập khẩu các module khác và cung cấp một số lượng bên ngoài tiếp cận xuất khẩu. Mô-đun ES6 có một số xuất khẩu mới và nhập khai báo. Chúng tôi đề nghị các thư viện TypeScript và các ứng dụng được cập nhật để sử dụng cú pháp mới, nhưng đây không phải là yêu cầu .

Source

Theo như tôi hiểu, đó có nghĩa là bạn được khuyến khích để di chuyển module nguyên cảo của riêng bạn để cú pháp mới, nhưng tiếp tục sử dụng import foo = require('foo') cho nhập khẩu các module AMD/CommonJS thực tế.

+0

Tuyên bố đó hơi gây nhầm lẫn khi nó đến từ Microsoft. ES6 không liên quan gì tới Typecript.Typescript có điểm tương đồng với ES6 ở chỗ nó cũng có một hệ thống mô-đun trước chuẩn (như cách mà Angular 1 có hệ thống mô-đun chuẩn trước). Bây giờ có một tiêu chuẩn chính thức, bám vào các mô-đun TS chuẩn trước là điều ngu xuẩn. – pmont

Các vấn đề liên quan