การประกาศล่วงหน้าในไทป์สคริปต์
ฉันมีสองคลาสที่จำเป็นต้องรู้จักสมาชิกของกันและกัน
ใน C++ ฉันจะใช้การประกาศล่วงหน้า
ฉันต้องทำอะไรในไทป์สคริปต์?
คำตอบ #1
ฉันไม่แน่ใจ แต่ฉันคิดว่าคุณกำลังพยายามแก้ปัญหาที่ไม่มีอยู่จริง นี่เป็นสิ่งที่ถูกต้องอย่างสมบูรณ์ในไทป์สคริปต์:
class A{
b=new B();
func(){
alert(this.b.member);
}
}
class B{
member="hello there";
}
var a=new A();
a.func();
อย่างที่คุณเห็น คุณสามารถใช้คลาส B ก่อนที่มันจะถูกกำหนดและเข้าถึงสมาชิกของมันจากภายในคลาส A สิ่งเดียวกันนี้ใช้ได้กับฟังก์ชันด้วย:
var a=()=>{
alert("function a");
b();
}
var b=()=>{
alert("function b");
}
a();
สิ่งนี้ควรคอมไพล์ได้ดี โปรดทราบว่า a สามารถเรียกได้ก็ต่อเมื่อ b ถูกนิยามแล้วเท่านั้น สิ่งนี้จะใช้ไม่ได้:
var a=()=>{
alert("function a");
b();
}
a();
var b=()=>{
alert("function b");
}
คุณไม่จำเป็นต้องมีการประกาศล่วงหน้าใน Typescript แค่จินตนาการว่ามันถูกสร้างขึ้นโดยอัตโนมัติสำหรับโค้ดของคุณ
ปัญหากลายเป็นซับซ้อนมากขึ้นเมื่อคุณต้องผสมผสาน Javascript และ Typescript เนื่องจากโค้ด Typescript ทั้งหมดของคุณจะถูกตรวจสอบประเภทแบบคงที่โดยคอมไพเลอร์ การเชื่อมต่อกับกรอบงาน Javascript จึงไม่ใช่เรื่องง่ายนัก
ตัวแปร ฟังก์ชัน และ "คลาส" ทั้งหมดที่เพิ่มลงในขอบเขตของคุณต้องได้รับการประกาศก่อนจึงจะสามารถใช้งานได้ สมมติว่าคุณต้องการ jQuery สําหรับโครงการ Typescript ของคุณ เวทมนตร์ jQuery ทั้งหมดทําได้ด้วยตัวแปรส่วนกลาง "$" แต่แม้ว่าคุณจะเพิ่มสคริปต์ jQuery ลงในไซต์ html ของคุณ คุณก็ไม่สามารถอ้างถึง "$" ในโค้ด Typescript ของคุณได้ นี่คือที่ที่ใช้ไฟล์การประกาศ โดยการเพิ่มเส้น
/// <reference path="jquery.d.ts"/>
ที่ด้านบนสุดของไฟล์ Typescript ของคุณ คุณแจ้งให้ตัวคอมไพเลอร์ทราบเกี่ยวกับโค้ด jQuery ทั้งหมดที่มีอยู่ ไฟล์ .d.ts สำหรับกรอบงาน Javascript ที่ใช้บ่อยที่สุดสามารถพบได้ที่นี่: https://github.com/borisyankov/DefinitelyTyped
สองบรรทัดสุดท้ายเป็นตัวอย่างที่ดีของไวยากรณ์ของไฟล์ .d.ts:
declare var jQuery: JQueryStatic;
declare var $: JQueryStatic;
ตอนนี้คอมไพเลอร์รู้แล้วว่ามีตัวแปรสากลสองตัวชื่อ "$" และ "jQuery" พร้อมให้คุณใช้งาน นอกจากนี้หากคุณกำลังใช้ VisualStudio ไฟล์การประกาศเหล่านี้จะช่วยให้รองรับ intellisense ได้อย่างยอดเยี่ยม
คำตอบ #2
สำหรับอินเทอร์เฟซ คุณจำเป็นต้องมีการประกาศล่วงหน้า
declare class F {}
interface A {
f:F ;
}
class F implement A {
f:F ;
init() { f=this; }
}
