ค้นหาเว็บไซต์

การประกาศล่วงหน้าในไทป์สคริปต์


ฉันมีสองคลาสที่จำเป็นต้องรู้จักสมาชิกของกันและกัน

ใน 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; }
}

บทความที่เกี่ยวข้อง