От автора: в TypeScript объекты — это экземпляры, которые содержат набор пар ключ-значение. Значениями могут быть скалярными значениями или функциями, или даже массивами других объектов. Синтаксис приведён ниже.
Синтаксис
1 2 3 4 5 6 7 8 |
var object_name = { key1: "value1", //скалярное значение key2: "value", key3: function() { //функции }, key4:["content1", "content2"] //набор }; |
Как показано выше, объект может содержать скалярные значения, функции и структуры, например массивы и кортежи. Пример: Нотация объектного литерала
1 2 3 4 5 6 7 |
var person = { firstname:"Tom", lastname:"Hanks" }; //доступ к значению объекта console.log(person.firstname) console.log(person.lastname) |
После компиляции, мы получим тот же код JavaScript. Результат выглядит следующим образом:
1 2 |
Tom Hanks |
Шаблон типа TypeScript
Предположим, вы создали в JavaScript такой литерал объекта:
1 2 3 4 |
var person = { firstname:"Tom", lastname:"Hanks" }; |
Если вы хотите добавить объекту какое-то значение, JavaScript позволяет выполнить необходимые модификации. Предположим, потом нам нужно добавить объекту person функцию, вот как мы можем это сделать.
1 |
person.sayHello = function(){ return "hello";} |
Если вы используете тот же код в Typescript, компилятор выдаст ошибку. Это связано с тем, что в Typescript конкретные объекты должны иметь шаблон типа. Объекты в Typescript должны быть экземплярами определённого типа. Решить эту проблему можно используя шаблон метода в объявлении. Пример: Шаблон типа Typescript
1 2 3 4 5 6 7 8 9 |
var person = { firstName:"Tom", lastName:"Hanks", sayHello:function() { } //Шаблон типа } person.sayHello = function() { console.log("hello "+person.firstName) } person.sayHello() |
После компиляции, мы получим тот же код JavaScript. Результат выглядит следующим образом:
1 |
hello Tom |
Объекты также могут быть переданы функции в качестве параметра. Пример: Объекты в качестве параметров функции
1 2 3 4 5 6 7 8 9 |
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) |
В этом коде мы объявляем литерал объекта. Выражение функции вызывается путём передачи объекта person. После компиляции мы получим следующий JavaScript код:
1 2 3 4 5 6 7 8 9 10 11 12 |
//Сгенерировано посредством 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); |
Результат выглядит следующим образом:
1 2 |
first name :Tom last name :Hanks |
Вы можете оперативно создавать и передавать анонимный объект. Пример: Анонимный объект
1 2 3 4 5 |
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:
1 2 3 4 5 6 7 8 |
//Сгенерировано посредством 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" }); |
Результат выглядит следующим образом:
1 2 3 |
first name :Sachin last name :Tendulkar Duck-typing |
Концепция duck-typing заключается в том, что два объекта считаются объектами одного типа, если оба они имеют одинаковый набор свойств. Чтобы проверить их соответствие, duck-typing подтверждает наличие определённых свойств у объектов, а не их действительный тип. Концепцию можно объяснить при помощи следующей фразы:
“Когда я вижу птицу, которая ходит, как утка, плавает, как утка, и крякает как утка, я считаю, что эта птица — утка”. TypeScript компилятор реализует систему duck-typing, которая позволяет оперативно создавать объект и сохранять безопасность типов. Следующий пример иллюстрирует, как мы можем передавать объекты функции, которые неявно реализуют интерфейс, но содержат все требующиеся члены.
Пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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} } //корректно var newPoint = addPoints({x:3,y:4},{x:5,y:1}) //Ошибка var newPoint2 = addPoints({x:1},{x:4,y:3}) |
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.