Bây giờ TypeScript xuất hiện, đó là một tin tức thú vị đối với tôi, nhưng làm cách nào tôi có thể chuyển đổi tất cả các tệp JavaScript hiện có sang TypeScript.
Bây giờ TypeScript xuất hiện, đó là một tin tức thú vị đối với tôi, nhưng làm cách nào tôi có thể chuyển đổi tất cả các tệp JavaScript hiện có sang TypeScript.
Câu trả lời:
Tôi sợ điều này sẽ rất có vấn đề. TypeScript là một siêu ký tự của JavaScript . Điều này ngụ ý rằng tất cả mã JavaScript hợp lệ cũng là mã TypeScript hợp lệ. Mà chỉ là sai. Đoạn mã sau đúng trong JavaScript, nhưng tạo ra lỗi trong TypeScript:
var data={x:5, y:6};
data.z=5;
Bạn có thể có được hành vi động của JavaScript bằng cách khai báo dữ liệu là "môi trường xung quanh"
var data:any={x:5, y:6};
data.z=5;
Bây giờ điều này cũng sẽ hoạt động trong TypeScript. Tuy nhiên, bạn có thể thay đổi phần mở rộng của tệp .js thành .ts và chuyển tệp này sang trình biên dịch TypeScript. Điều này thực sự làm tôi bối rối và tôi đã đặt câu hỏi trong kênh TypeScript IRC trên freenode. Hóa ra trình biên dịch typecript kiểm tra đầu vào của nó cho JavaScript hợp lệ và chỉ không làm gì trong trường hợp nó tìm thấy thứ gì đó. Trực giác điều này nghe có vẻ tốt. Bạn sẽ có thể "chuyển đổi" tất cả JavaScript của mình sang Bản mô tả bằng cách chỉ cập nhật các phần mở rộng tệp và sẽ tốt hơn. Thật không may, điều này không làm việc như mong đợi. Giả sử bạn đã có mã này:
var func=function(n){alert(n)};
var data={x:5};
data.z=6;
Chỉnh sửa: Tôi vừa thử biên dịch cái này và nó không hoạt động. Tôi xin lỗi, tôi dường như đã nhầm lẫn: Trình biên dịch TypeScript thậm chí không chấp nhận JavaScript thuần túy. Tôi sẽ cố gắng tìm ra những gì đã sai.
Bạn đã thay đổi phần mở rộng tệp thành .ts và sử dụng hàm func trong mã khác của bạn. Lúc đầu mọi thứ có vẻ ổn nhưng sau đó một con bọ xấu xí lại xuất hiện. Bạn quyết định rằng một số kiểm tra kiểu tĩnh có thể sẽ giúp bạn và bạn thay đổi mã thành:
var func=function(n:string){alert(n)};
var data={x:5};
data.z=6;
Nhưng bây giờ đây không còn là mã JavaScript hợp lệ và sẽ khiến trình biên dịch tạo ra nhiều thông báo lỗi. Sau khi tất cả dữ liệu không có thành viên "z". ... Hành vi này có thể tránh được nếu loại mặc định luôn luôn "bất kỳ" nhưng sau đó loại suy luận sẽ hoàn toàn vô dụng.
Vậy làm thế nào để bạn giải quyết vấn đề này? Câu trả lời là: hồ sơ khai báo. Bạn có thể sử dụng mã JavaScript "như hiện tại" trong dự án và vẫn kiểm tra kiểu tĩnh với sự trợ giúp của một vài tệp .d.ts. Họ thông báo cho trình biên dịch những biến, phương thức và "lớp" nào được khai báo trong tệp JavaScript, bao gồm các kiểu của chúng. Do đó, chúng cho phép kiểm tra kiểu thời gian biên dịch và intellisense tuyệt vời. Một tệp .d.ts cho ví dụ của tôi sẽ là
declare var data:any;
declare function func(n:string);
Lưu cái này dưới dạng "myjsfile.d.ts" và nhập nó vào bản thảo với
///<reference path="myjsfile.d.ts"/>
hãy chắc chắn bao gồm tập lệnh JavaScript trong tệp html của bạn phía trên bản thảo được biên dịch. Đây là một liên kết thú vị . Bạn có thể quan tâm đến phần "Biến JavaScript thành TypeScript".
noEmitOnErrorlà tắt, nó vẫn có thể hoạt động và phát ra sự dịch chuyển của nó. Do đó, mặc dù nó hiển thị các lỗi (đang làm phiền), nhưng bạn thực sự có thể bỏ qua các lỗi đó và sử dụng dịch chuyển TypeScript mặc dù nó (ví dụ, cho phép chuyển dần từ JS sang TS). Ngoài ra, ít nhất một số lỗi có thể bị vô hiệu hóa thông qua các công tắc như noImplicitAny(có lẽ là tất cả, mặc dù IDK).
Cập nhật: Công cụ được mô tả chi tiết trong bài viết này
ReSharper bắt đầu với phiên bản 9 ( có sẵn bản dựng EAP ) có chức năng tự động chuyển đổi mã JavaScript thành TypeScript. Bạn có thể bắt đầu với việc đổi tên tệp .js thành .ts và xem các đề xuất R # như thế này:

Không thử nó trên các ví dụ thực tế. Nhưng nó có khả năng chuyển đổi số lượng lớn các mẫu JavaScript.
Từ thiết bị đầu cuối (mac):
for f in *.js; do mv $f `basename $f .js`.ts; done;
Đổi tên tất cả các tệp .js thành .ts
Điều này hơi khó hiểu - nhưng như Benjamin chỉ ra các tệp JavaScript ở trên là TypeScript hợp lệ . Nếu bạn muốn thêm các loại, lớp, giao diện, v.v. vào JavaScript của mình - bạn sẽ cần phải thiết kế và thay đổi mã của mình bằng các khái niệm này - có rất ít / không có chuyển đổi tự động cho việc này.
Với công cụ tìm kiếm GNU (hầu hết * nixes) + Bash, chỉ cần làm:
find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;
var a = 5; a = "";