TypeScript - วัตถุ

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

ไวยากรณ์

var object_name = { 
   key1: “value1”, //scalar value 
   key2: “value”,  
   key3: function() {
      //functions 
   }, 
   key4:[“content1”, “content2”] //collection  
};

ดังที่แสดงไว้ด้านบนวัตถุสามารถมีค่าสเกลาร์ฟังก์ชันและโครงสร้างเช่นอาร์เรย์และสิ่งทอ

ตัวอย่าง: Object Literal Notation

var person = { 
   firstname:"Tom", 
   lastname:"Hanks" 
}; 
//access the object values 
console.log(person.firstname) 
console.log(person.lastname)

ในการคอมไพล์จะสร้างโค้ดเดียวกันใน JavaScript

ผลลัพธ์ของรหัสด้านบนมีดังนี้ -

Tom 
Hanks

เทมเพลตประเภท TypeScript

สมมติว่าคุณสร้าง object literal ใน JavaScript เป็น -

var person = { 
   firstname:"Tom", 
   lastname:"Hanks" 
};

ในกรณีที่คุณต้องการเพิ่มค่าบางอย่างให้กับออบเจ็กต์ JavaScript อนุญาตให้คุณทำการแก้ไขที่จำเป็น สมมติว่าเราต้องเพิ่มฟังก์ชันให้กับวัตถุบุคคลในภายหลังนี่คือวิธีที่คุณสามารถทำได้

person.sayHello = function(){ return "hello";}

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

คุณสามารถแก้ปัญหานี้ได้โดยใช้เทมเพลตวิธีการในการประกาศ

ตัวอย่าง: เทมเพลตประเภท typescript

var person = {
   firstName:"Tom", 
   lastName:"Hanks", 
   sayHello:function() {  }  //Type template 
} 
person.sayHello = function() {  
   console.log("hello "+person.firstName)
}  
person.sayHello()

ในการคอมไพล์จะสร้างโค้ดเดียวกันใน JavaScript

ผลลัพธ์ของรหัสด้านบนมีดังนี้ -

hello Tom

ออบเจ็กต์สามารถส่งผ่านเป็นพารามิเตอร์ในการทำงานได้

ตัวอย่าง: ออบเจ็กต์เป็นพารามิเตอร์ของฟังก์ชัน

var person = { 
   firstname:"Tom", 
   lastname:"Hanks" 
}; 
var invokeperson = function(obj: { firstname:string, lastname :string }) { 
   console.log("first name :"+obj.firstname) 
   console.log("last name :"+obj.lastname) 
} 
invokeperson(person)

ตัวอย่างประกาศอ็อบเจ็กต์ลิเทอรัล นิพจน์ฟังก์ชันถูกเรียกใช้อ็อบเจ็กต์บุคคลที่ส่งผ่าน

ในการคอมไพล์จะสร้างโค้ด JavaScript ต่อไปนี้

//Generated by typescript 1.8.10
var person = {
   firstname: "Tom",
   lastname: "Hanks"
};

var invokeperson = function (obj) {
   console.log("first name :" + obj.firstname);
   console.log("last name :" + obj.lastname);
};

invokeperson(person);

ผลลัพธ์มีดังนี้ -

first name :Tom 
last name :Hanks

คุณสามารถสร้างและส่งผ่านวัตถุที่ไม่ระบุตัวตนได้ทันที

ตัวอย่าง: Anonymous Object

var invokeperson = function(obj:{ firstname:string, lastname :string}) { 
   console.log("first name :"+obj.firstname) 
   console.log("last name :"+obj.lastname) 
} 
invokeperson({firstname:"Sachin",lastname:"Tendulkar"});

ในการคอมไพล์จะสร้างโค้ด JavaScript ต่อไปนี้

//Generated by typescript 1.8.10
var invokeperson = function (obj) {
   console.log("first name :" + obj.firstname);
   console.log("last name :" + obj.lastname);
};

invokeperson({ firstname: "Sachin", lastname: "Tendulkar" });
invokeperson({ firstname: "Sachin", lastname: "Tendulkar" });

ผลลัพธ์มีดังนี้ -

first name :Sachin 
last name :Tendulkar

เป็ดพิมพ์

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

“ เมื่อฉันเห็นนกตัวหนึ่งที่เดินเหมือนเป็ดและว่ายน้ำเหมือนเป็ดและต้มตุ๋นเหมือนเป็ดฉันเรียกนกตัวนั้นว่าเป็ด”

คอมไพเลอร์ TypeScript ใช้ระบบการพิมพ์เป็ดที่อนุญาตให้สร้างวัตถุได้ทันทีในขณะที่รักษาความปลอดภัยของประเภท ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเราสามารถส่งผ่านออบเจ็กต์ที่ไม่ได้ใช้อินเทอร์เฟซอย่างชัดเจน แต่มีสมาชิกที่จำเป็นทั้งหมดไปยังฟังก์ชันได้อย่างไร

ตัวอย่าง

interface IPoint { 
   x:number 
   y:number 
} 
function addPoints(p1:IPoint,p2:IPoint):IPoint { 
   var x = p1.x + p2.x 
   var y = p1.y + p2.y 
   return {x:x,y:y} 
} 

//Valid 
var newPoint = addPoints({x:3,y:4},{x:5,y:1})  

//Error 
var newPoint2 = addPoints({x:1},{x:4,y:3})