มีเครื่องมือในการแปลงไฟล์ JavaScript เป็น TypeScript หรือไม่ [ปิด]


134

ตอนนี้ TypeScript ออกมาแล้วมันเป็นข่าวที่น่าตื่นเต้นสำหรับฉัน แต่ฉันจะแปลงไฟล์ JavaScript ที่มีอยู่ทั้งหมดเป็น TypeScript ได้อย่างไร


3
ไฟล์ javascript ทั้งหมดของคุณเป็นไฟล์ typescript อยู่แล้วเนื่องจาก typescript เป็นส่วนเหนือของจาวาสคริปต์
Benjamin Gruenbaum

6
นี่คือสิ่งที่ตรงกันข้ามกับนอกหัวข้อการแปลงจากภาษาการเขียนโปรแกรมหนึ่งไปเป็นอีกภาษาหนึ่งคือคำถามเกี่ยวกับการเขียนโปรแกรมทั้งหมด
Ivan Castellanos

2
@Tony_Henrich ถ้าอย่างนั้นสิ่งนี้ควรถูกย้ายไปที่นั่นแทนที่จะเป็น "ปิดเป็น offtopic" และ btw ไซต์ดังกล่าวควรมีหมวดหมู่ที่ชัดเจนสำหรับคำแนะนำซอฟต์แวร์สำหรับวิศวกรซอฟต์แวร์
Ivan Castellanos

3
@Tony_Henrich ให้ทำตามนี้: นี่คือผลลัพธ์อันดับต้น ๆ บนอินเทอร์เน็ตสำหรับ "แปลง JavaScript เป็น TypeScript" และสิ่งที่ดีที่สุดที่คุณทำได้คือปิดคำตอบเพิ่มเติมแล้วเรียกมันว่านอกหัวข้อ? ฉันคิดว่าความคิดที่คับแคบเช่นนี้จะทำให้เว็บไซต์นี้เสียชีวิต
Ivan Castellanos

5
ไร้สาระที่ปิดเป็นหัวข้อ
bharal

คำตอบ:


112

ฉันกลัวว่านี่จะเป็นปัญหามาก typescript เป็น superset ของ JavaScript นี่หมายความว่าโค้ด JavaScript ที่ถูกต้องทั้งหมดยังเป็นรหัส TypeScript ที่ถูกต้อง ซึ่งผิดเพียง. รหัสต่อไปนี้ถูกต้องใน JavaScript แต่สร้างข้อผิดพลาดใน TypeScript:

var data={x:5, y:6};
data.z=5;

คุณสามารถรับพฤติกรรมแบบไดนามิกของ JavaScript ได้โดยการประกาศข้อมูลเป็น "สภาพแวดล้อม"

var data:any={x:5, y:6};
data.z=5;

ตอนนี้สิ่งนี้จะทำงานใน TypeScript ด้วย อย่างไรก็ตามคุณสามารถเปลี่ยนนามสกุลของไฟล์. js เป็น. ts และส่งไฟล์นี้ไปยังคอมไพเลอร์ TypeScript สิ่งนี้ทำให้ฉันสับสนจริงๆและฉันถามคำถามในช่อง TypeScript IRC บน freenode ปรากฎว่าคอมไพลเลอร์ typescript ตรวจสอบอินพุตสำหรับ JavaScript ที่ถูกต้องและไม่ได้ทำอะไรเลยในกรณีที่พบบางสิ่ง โดยสัญชาตญาณนี้ฟังดูดี คุณควรจะสามารถ "แปลง" JavaScript ทั้งหมดของคุณให้เป็น typescript ได้โดยการอัปเดตนามสกุลไฟล์เท่านั้นและพร้อมใช้งาน น่าเสียดายที่ไม่ได้ผลตามที่คาดไว้ สมมติว่าคุณมีรหัสนี้:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

แก้ไข: ฉันเพิ่งพยายามรวบรวมสิ่งนี้ แต่ไม่ได้ผล ฉันขอโทษดูเหมือนว่าฉันเข้าใจผิด: คอมไพเลอร์ TypeScript ไม่ยอมรับ JavaScript บริสุทธิ์ด้วยซ้ำ ฉันจะพยายามหาสิ่งที่ผิดพลาด

คุณได้เปลี่ยนนามสกุลไฟล์เป็น. ts และใช้ฟังก์ชัน func ในโค้ดอื่นของคุณ ตอนแรกทุกอย่างดูเหมือนจะดี แต่แล้วข้อผิดพลาดที่น่าเกลียดก็ปรากฏ คุณตัดสินใจว่าการตรวจสอบประเภทคงที่อาจช่วยคุณได้และคุณเปลี่ยนรหัสเป็น:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

แต่ตอนนี้นี่ไม่ใช่โค้ด JavaScript ที่ถูกต้องอีกต่อไปและจะทำให้คอมไพเลอร์สร้างข้อความแสดงข้อผิดพลาดจำนวนมาก หลังจากข้อมูลทั้งหมดไม่มีสมาชิก "z" ... พฤติกรรมนี้สามารถหลีกเลี่ยงได้หากประเภทเริ่มต้นเป็น "ใด ๆ " เสมอ แต่การอนุมานประเภทจะไร้ประโยชน์อย่างที่สุด

แล้วคุณจะแก้ปัญหานี้อย่างไร? คำตอบคือไฟล์ประกาศ คุณสามารถใช้โค้ด JavaScript ของคุณ "ตามสภาพ" ในโปรเจ็กต์และยังคงได้รับการตรวจสอบประเภทคงที่ด้วยความช่วยเหลือของไฟล์. d.ts บางไฟล์ พวกเขาแจ้งคอมไพเลอร์ว่าตัวแปรวิธีการและ "คลาส" ใดบ้างที่ประกาศในไฟล์ JavaScript รวมถึงประเภทของตัวแปร ดังนั้นจึงอนุญาตให้มีการตรวจสอบประเภทเวลาคอมไพล์และ Intellisense ที่ยอดเยี่ยม ไฟล์. d.ts สำหรับตัวอย่างของฉันจะเป็น

declare var data:any;
declare function func(n:string);

บันทึกเป็น "myjsfile.d.ts" และนำเข้าสู่ typescript ด้วย

///<reference path="myjsfile.d.ts"/>

อย่าลืมรวมสคริปต์ JavaScript ไว้ในไฟล์ html ของคุณเหนือ typescript ที่คอมไพล์แล้ว นี่คือการเชื่อมโยงที่น่าสนใจ คุณอาจสนใจในส่วน "การเปลี่ยน JavaScript เป็น TypeScript"


58
+1 เพื่อชี้ให้เห็นว่า JS ที่ถูกต้องไม่ใช่ TS ที่ถูกต้องทั้งหมด
Ken Smith

14
จริงๆแล้วข้อมูลโค้ดจาวาสคริปต์ทั้งหมดที่คุณโพสต์เป็นแบบสคริปต์ที่ถูกต้อง คุณเพียงแค่ต้องปิดสวิตช์คอมไพเลอร์บางตัวเช่น --noImplictAny เป็นต้นอย่างไรก็ตามควรเปิดใช้งานในที่สุดและเพิ่มคำอธิบายประกอบประเภทตามที่จำเป็น
Liero

ขอบคุณ. ฉันไม่ได้รับอะไรเลยนอกจากการโต้แย้งเมื่อฉันบอกผู้คนว่า TypeScript ไม่ใช่ส่วนเหนือของ JavaScript ไม่ว่าฉันจะให้ตัวอย่างใดก็ตาม ในที่สุดผู้คนก็ยอมแพ้ในการโต้แย้งเมื่อฉันแสดงให้พวกเขาเห็นว่าทำไมพวกเขาก็เถียงเหมือนเดิมในสัปดาห์หน้าราวกับว่าจะลืมหลักฐานในพุดดิ้ง " รหัส JavaScript ที่ถูกต้องทั้งหมดเป็นรหัส TypeScript ที่ถูกต้องด้วย ... ผิด " - LHK
Cody

3
ด้วย TypeScript ที่อนุญาตให้คอมไพล์เป็น JavaScript แม้จะมี "ข้อผิดพลาด" ของ TypeScript (ในเวอร์ชันสาธิตปัจจุบันของ TypeScript ตัวอย่าง JavaScript ทั้งหมดในคำตอบนี้ไม่มีปัญหาในการคอมไพล์) ชนิดของมันทำงานเป็น superset - อย่างน้อยก็ของคุณสมบัติ JavaScript ที่ คอมไพเลอร์ TypeScript สามารถจัดการได้ ...
Brett Zamir

ใช่ฉัน "เข้าใจทั้งสองด้าน" ของปัญหานี้แล้ว โดยทั่วไป TS เป็นส่วนเหนือของ JS ในแง่ที่ว่า: TypeScript จะบ่นเกี่ยวกับรหัส JS ที่ถูกต้อง แต่ตราบใดที่noEmitOnErrorปิดอยู่ก็ยังสามารถทำงานและปล่อยการถ่ายเทได้ ดังนั้นในขณะที่แสดงข้อผิดพลาด (ซึ่งเป็นการรบกวน) คุณสามารถเพิกเฉยต่อข้อผิดพลาดเหล่านั้นและใช้การถ่ายทอด TypeScript ได้แม้ว่าจะมีข้อผิดพลาดก็ตาม (อนุญาตเช่นค่อยๆเปลี่ยนจาก JS เป็น TS) นอกจากนี้อย่างน้อยข้อผิดพลาดบางอย่างสามารถปิดใช้งานผ่านสวิตช์เช่นnoImplicitAny(อาจทั้งหมดแม้ว่าจะเป็น IDK)
Venryx

51

อัปเดต: มีการอธิบายรายละเอียดเครื่องมือไว้ในโพสต์นี้

ReSharper ที่เริ่มต้นด้วยเวอร์ชัน 9 (มีEAP builds ) มีฟังก์ชันในการแปลงโค้ด JavaScript เป็น TypeScript โดยอัตโนมัติ คุณสามารถเริ่มต้นด้วยการเปลี่ยนชื่อไฟล์. js เป็น. ts และดูคำแนะนำ R # เช่นนี้:

ยังไม่ได้ลองใช้กับตัวอย่างในโลกแห่งความเป็นจริง แต่สามารถแปลงรูปแบบ JavaScript จำนวนมากได้


ฉันชอบที่จะทำสิ่งนี้ได้ทันทีโดยใช้ไฟล์เมตาที่แก้ไขด้วยมือสร้าง TS ขยายทั้งหมดที่ต้องการ
xamiro

สวัสดีฉันใช้ resharper จึงเปลี่ยนชื่อเฉพาะจาก. js เป็น .ts เท่านั้นใช่ไหม เช่นฉันใช้ไฟล์ a.js และเปลี่ยนชื่อไฟล์โดยที่ a.ts นั้น resharper จะให้ข้อเสนอแนะใด ๆ ? ฉันใช้เวอร์ชันชุมชน Visual Studio และติดตั้ง Resharper
Swift

1

จากเทอร์มินัล (mac):

for f in *.js; do mv $f `basename $f .js`.ts; done;

เปลี่ยนชื่อไฟล์. js ทั้งหมดเป็น. ts

นี้จะค่อนข้างลิ้นในแก้ม - แต่เป็นเบนจามินชี้ให้เห็นข้างต้นไฟล์ JavaScript เป็น typescript หากคุณต้องการเพิ่มประเภทคลาสอินเทอร์เฟซและอื่น ๆ ลงใน JavaScript ของคุณคุณจะต้องออกแบบและเปลี่ยนแปลงโค้ดของคุณเองโดยใช้แนวคิดเหล่านี้มีการแปลงอัตโนมัติเพียงเล็กน้อย / ไม่มีเลย

ด้วย GNU findutils (ส่วนใหญ่ * nixes) + Bash เพียงแค่ทำ:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;

10
+1 - มันเหมือนกับการพยายามแปลงหนังสือย่อส่วนกลับเป็นเวอร์ชันเต็มโดยอัตโนมัติ
เฟนตัน

ข้อมูลประเภททั้งหมดจะถูกลบออกและอินเทอร์เฟซทั้งหมดจะถูกลบ - ข้อมูลนั้นหายไปค่อนข้างมาก JavaScript ใด ๆ ที่มีข้อมูลเพียงพอที่จะสรุปข้อมูลประเภทสามารถวางลงในไฟล์ TypeScript ได้แล้วและคอมไพเลอร์จะหาประเภทต่างๆ แต่มีหลายอินสแตนซ์ที่ใช้ไม่ได้เนื่องจาก JavaScript ไม่สอดคล้องกัน
เฟนตัน

1
แปลงจากอะไรเป็นอะไร? หาประเภทจาก JS และเพิ่มลงใน vars? ไม่แน่ใจว่าจะแปลงอะไรได้อีกโดยอัตโนมัติไม่แน่ใจว่าคลาสอินเทอร์เฟซโมดูลสามารถรับได้อย่างไร (อย่างสนิทใจ)
7zark7

4
รหัส JavaScript บางรหัสไม่ถูกต้องใน TypeScript ให้ลองทำดังนี้var a = 5; a = "";
coudy

4
ประการที่สองและปรับการโหวตลดลงคุณจะรู้ได้อย่างรวดเร็วว่าโค้ด JS บางตัวไม่สามารถใช้ได้ใน TypeScript เมื่อคุณพยายามแปลงโมดูลหรือปลั๊กอินเป็น TypeScript จาก JS ดั้งเดิม (เช่น jquery.address ฯลฯ )
dpb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.