Typescript object with objects

Typescript object with objects

Last updated: Jan 23, 2023
Reading time · 3 min

banner

# Declare and Type a nested Object in TypeScript

Use an interface or a type alias to type a nested object in TypeScript. You can set properties on the interface that point to nested objects.

The type of the object can have as deeply nested properties as necessary.

Copied!
interface Person name: string; address: country: string; city: string; >; > const person: Person = name: 'Bobby Hadz', address: country: 'Chile', city: 'Santiago', >, >;

We used an interface to type an object that has nested properties.

The address property points to an object that has country and city properties of type string .

# Using a type alias to type a nested Object

You can also use a type alias to achieve the same result.

Copied!
type Person = name: string; address: country: string; city: string; >; >; const person: Person = name: 'Bobby Hadz', address: country: 'Chile', city: 'Santiago', >, >;

There are some minor differences between type aliases and interface, however, the examples above do the exact same.

# Typing nested objects inline

You might also see examples online that type nested objects inline.

Copied!
const person: name: string; address: country: string; city: string >; > = name: 'Bobby Hadz', address: country: 'Chile', city: 'Santiago', >, >;

However, especially with nested objects, inline types are very difficult to read and should generally be avoided.

# Letting TypeScript infer the type of a nested Object

If you declare a nested object and initialize all of its key-value pairs, you can let TypeScript infer its type.

Copied!
/** * const person: name: string; address: country: string; city: string; >; > */ const person = name: 'Bobby Hadz', address: country: 'Chile', city: 'Santiago', >, >;

TypeScript is able to infer the type of the object based on the key-value pairs we have provided upon initialization.

This is a very easy way to learn the type of something — initialize it with values, assign it to a variable and hover over the variable to see its inferred type.

# Marking some of the properties of the object as optional

If you don’t have all of the values of the nested object ahead of time, you can mark them as optional, by using a question mark in the type’s definition.

Copied!
type Person = name: string; address?: // 👈️ address is optional country: string; city: string; >; >; const person: Person = name: 'Bobby Hadz', >; person.address = country: 'Chile', city: 'Santiago', >;

We marked the address property on the nested object as optional, so we aren’t required to provide it when initializing the object.

# Typing nested objects with an index signature

You can use an index signature if you don’t know all of the names of an object’s properties in advance.

Copied!
type Person = name: string; address: country: string; city: string; [key: string]: any; // 👈️ index signature >; >; const person: Person = name: 'Bobby Hadz', address: country: 'Chile', city: 'Santiago', >, >; person.address.street = 'Example str. 123'; person.address.postCode = 123;

The syntax is an index signature in TypeScript and is used when we don’t know all the names of a type’s properties and the shape of the values ahead of time.

The index signature in the examples means that when the address nested object is indexed with a string , it will return a value of any type.

You might also see the index signature in examples. It represents a key-value structure that when indexed with a string returns a value of type string .

The example shows how even though we didn’t define the address.street or address.postCode properties, we are still able to set them on the nested object.

# Additional Resources

You can learn more about the related topics by checking out the following tutorials:

I wrote a book in which I share everything I know about how to become a better, more efficient programmer.

Источник

Назначение типов вложенным объектам в TypeScript

Назначение типов вложенным объектам в TypeScript

Объекты — это то, с чем вы имеете дело, работая разработчиком JavaScript, и, разумеется, это справедливо и для TypeScript. TypeScript предоставляет вам несколько способов определения определений типов для свойств объектов. В этой статье мы рассмотрим несколько из них, начиная с простых примеров и переходя к некоторым расширенным определениям типов.

Использование ключевого слова type

Свойствам объекта можно присвоить определения типа с помощью ключевого слова type в TypeScript. Это самый простой и предпочтительный метод присвоения определений типов при работе с простыми объектами. Вот пример типа Airplane и объекта airplane .

// Defining Airplane Type type Airplane =  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; >; // Creating airplane Object const airplane: Airplane =  model: "Airbus A380", flightNumber: "A2201", timeOfDeparture: new Date(), timeOfArrival: new Date(), >; 

Вложенные объекты

Если ваш объект имеет вложенный объект, вы можете вложить определения типов, используя само ключевое слово type. Вот пример вложенного объекта с именем caterer внутри определения типа Airplane .

type Airplane =  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; caterer:  name: string; address: string; phone: number; >; >; const airplane: Airplane =  model: "Airbus A380", flightNumber: "A2201", timeOfDeparture: new Date(), timeOfArrival: new Date(), caterer:  name: "Special Food Ltd", address: "484, Some Street, New York", phone: 1452125, >, >; 

Абстрагирование вложенных объектов в отдельные типы

Если у вас есть большие объекты, определение вложенных типов может стать громоздким. В таком случае вы можете определить отдельный тип Caterer для вложенного объекта. Это также абстрагирует тип Caterer от типа Airplane , что позволит вам использовать тип Caterer в других частях вашего кода.

type Airplane =  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; caterer: Caterer; >; const airplane: Airplane =  model: "Airbus A380", flightNumber: "A2201", timeOfDeparture: new Date(), timeOfArrival: new Date(), caterer:  name: "Special Food Ltd", address: "484, Some Street, New York", phone: 1452125, >, >; 

Использование сигнатур индекса с вложенными объектами

Сигнатуры индекса можно использовать, когда вы не уверены, сколько свойств будет у объекта, но уверены в типе свойств объекта. Мы можем определить другой тип, называемый Seat , который может быть подробной информацией о пассажире, путешествующем на каждом месте типа Airplane . Мы можем использовать сигнатуру индекса, чтобы присвоить строковый тип всем свойствам мест.

type Caterer =  name: string; address: string; phone: number; >; type Seat =  [key: string]: string; >; type Airplane =  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; caterer:  name: string; address: string; phone: number; >; seats: Seat[]; >; const airplane: Airplane =  model: "Airbus A380", flightNumber: "A2201", timeOfDeparture: new Date(), timeOfArrival: new Date(), caterer:  name: "Special Food Ltd", address: "484, Some Street, New York", phone: 1452125, >, seats: [  name: "Mark Allen", number: "A3", >,  name: "John Doe", number: "B5", >, ], >; 

Интерфейсы для назначения типов свойствам объекта

Если вам нужно создать классы для генерации объектов, лучше использовать interfaces вместо ключевого слова type. Вот пример объекта airplane , созданного с использованием класса Airplane , который расширяет интерфейс IAirplane .

interface IAirplane  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; > class Airplane implements IAirplane  public model = "Airbus A380"; public flightNumber = "A2201"; public timeOfArrival = new Date(); public timeOfDeparture = new Date(); > const airplane: Airplane = new Airplane(); 

Вложенные объекты с использованием интерфейсов

Точно так же, как мы использовали ключевое слово type , interfaces также можно использовать для строгой типизации вложенных объектов с классами.

interface ICaterer  name: string; address: string; phone: number; > interface ISeat  name: string; number: string; > interface IAirplane  model: string; flightNumber: string; timeOfDeparture: Date; timeOfArrival: Date; > class Caterer implements ICaterer  public name = "Special Food Ltd"; public address = "484, Some Street, New York"; public phone = 1452125; > class Seat implements ISeat  public name = "John Doe"; public number = "A3"; > class Airplane implements IAirplane  public model = "Airbus A380"; public flightNumber = "A2201"; public timeOfArrival = new Date(); public timeOfDeparture = new Date(); public caterer = new Caterer(); public seats = [new Seat()]; > const airplane: Airplane = new Airplane(); 

Что вы можете сделать дальше 🙏😊

Если вам понравилась статья, рассмотрите возможность подписки на Cloudaffle, мой канал на YouTube, где я продолжаю публиковать подробные руководства и все обучающие материалы для программного обеспечения. Разработчики. Вы также можете следить за мной на Hashnode; дескриптор моего профиля — @Cloudaffle. Ставьте лайк, если вам понравилась статья; это поддерживает мою мотивацию на высоком уровне 👍.

. информация Также опубликовано здесь.

Источник

Читайте также:  Kotlin getter and setters
Оцените статью