Có công cụ nào để chuyển đổi các tệp JavaScript thành TypeScript [đã đóng]


133

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.


3
Tất cả các tệp javascript của bạn đã là các tệp bản thảo vì bản in là một siêu tệp javascript.
Benjamin Gruenbaum

6
Điều này trái ngược với chủ đề ngoài luồng, chuyển đổi từ ngôn ngữ lập trình này sang ngôn ngữ khác là HOÀN TOÀN một câu hỏi lập trình.
Ivan Castellanos

2
@Tony_Henrich Vậy thì điều này nên được chuyển đến đó thay vì "đóng như không chính thức", và btw trang web đó nên có một danh mục rõ ràng cho các đề xuất phần mềm dành cho các kỹ sư phần mềm.
Ivan Castellanos

3
@Tony_Henrich Hãy đặt nó theo cách này: Đây là kết quả hàng đầu trên internet để "chuyển đổi JavaScript thành TypeScript" và điều tốt nhất bạn có thể làm là đóng nó từ các câu trả lời tiếp theo và gọi nó ngoài chủ đề? Tôi nghĩ rằng suy nghĩ hạn hẹp như vậy sẽ là sự sụp đổ của trang web này.
Ivan Castellanos

5
nực cười là điều này đã bị đóng cửa như lạc đề.
bharal

Câu trả lời:


112

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".


57
+1 để chỉ ra rằng không phải tất cả các JS hợp lệ là TS hợp lệ.
Ken Smith

14
Trên thực tế, tất cả các đoạn mã javascript bạn đã đăng là bản đánh máy hợp lệ. Bạn chỉ cần tắt một số trình biên dịch chuyển như --noImplictAny, vv Tuy nhiên, ý tưởng tốt đẹp của nó để bật chúng lên cuối cùng và thêm chú thích loại khi cần
Liero

Cảm ơn bạn. Tôi không nhận được gì ngoài tranh luận khi tôi nói với mọi người TypeScript không phải là siêu dữ liệu của JavaScript, bất kể tôi cung cấp ví dụ nào. Cuối cùng mọi người từ bỏ cuộc tranh luận khi tôi chỉ cho họ lý do tại sao, và sau đó họ tranh luận giống hệt vào tuần sau như thể để quên đi bằng chứng trong bánh pudding. " tất cả mã JavaScript hợp lệ cũng là mã TypeScript hợp lệ ... chỉ là sai " - LHK
Cody

3
Với TypeScript cho phép biên dịch thành JavaScript mặc dù "lỗi" TypeScript (trong phiên bản demo hiện tại của TypeScript, tất cả các ví dụ JavaScript trong câu trả lời này không có vấn đề biên dịch), nó hoạt động như một siêu bộ - ít nhất là các tính năng JavaScript đó. trình biên dịch TypeScript có khả năng xử lý ...
Brett Zamir

Vâng, tôi đã "ở cả hai phía" của vấn đề này. Về cơ bản, TS là một superset của JS theo nghĩa: TypeScript sẽ phàn nàn về một số mã JS hợp lệ, nhưng miễn 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).
Venryx

51

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ôi rất thích làm điều này một cách nhanh chóng bằng cách sử dụng các tệp meta được chỉnh sửa bằng tay, tạo ra tất cả các TS phình to cần thiết.
xamiro

Xin chào, tôi đang sử dụng resharper nên chỉ đổi tên tốt từ .js thành .ts thôi? Giống như tôi đang sử dụng tệp a.js và đổi tên tệp wih a.ts đang chia sẻ lại sẽ đưa ra bất kỳ đề xuất nào? Tôi đang sử dụng phiên bản cộng đồng phòng thu trực quan và đã cài đặt Resharper
Swift

0

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 {} \;

10
+1 - giống như cố gắng tự động chuyển đổi một cuốn sách rút gọn thành phiên bản đầy đủ.
Fenton

Tất cả các thông tin loại được loại bỏ và tất cả các giao diện được loại bỏ - đó là khá nhiều thông tin đã biến mất. Bất kỳ JavaScript nào có đủ thông tin để suy ra thông tin loại chỉ có thể được dán vào tệp TypeScript và trình biên dịch sẽ xử lý các loại, nhưng có nhiều trường hợp không hoạt động vì JavaScript không nhất quán.
Fenton

1
Chuyển đổi từ những gì để mặc dù? Lấy các loại từ JS và thêm chúng vào vars? Không chắc chắn những gì khác có thể được tự động chuyển đổi, không chắc chắn làm thế nào các lớp, giao diện, mô-đun có thể được bắt nguồn (hoàn toàn).
7zark7

4
Không phải tất cả mã JavaScript đều hợp lệ trong TypeScript, hãy thử điều này:var a = 5; a = "";
coudy

4
Để giải thích điều đó và biện minh cho downvote, bạn sẽ nhận ra rất nhanh rằng không phải tất cả mã JS đều hợp lệ trong TypeScript khi bạn cố gắng chuyển đổi các mô-đun hoặc plugin thành TypeScript từ JS gốc của chúng (ví dụ: jquery.address, v.v.)
dpb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.