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})