Skip to Content
Начало типизацииСоздания своих типов

Создания своих типов

Чтобы создать свой тип, мы можем использовать следующие ключевые слова: type и interface, также можем использовать абстрактные классы (abstact class), но если быть честным, то я сам немного не понимаю, как они работают.

Отличия

На самом деле эти два метода создания типа довольно похожи, однако имеют свои различия. Например:

interface Foo {...}; type Bar = {...};

Заметили, да? Чтобы создать тип через type нам нужно использовать знак =, а при interface такого не наблюдается. Скоро поймете почему так.

interface Foo { name: string age: number }; interface Foo { address: string } const foo: Foo = { name: "FOCKUSTY", age: 15, address: "Улица Пушкина дом Колотушкина" };

Возможно Вы и не поняли, так что я поясню: interface можно спокойно расширять, просто дописывая interface {name} и объявляя его заново. Через type такого сделать не получится.

interface Foo { [key: number]: string }; type Foo2 = string[];

Что ж, вот так вот объявляются массивы с помощью двух разных методов. Рекомендую использовать type для объявления типа массива, потому что через interface код получится совсем не читаемым.

type = string | number; const : = 1; const : = "some string"; type = { : string } & { : number }; // { name: string, age: number } const : = { : "FOCKUSTY", : 15 }; type = { : string } | { : number }; const : = { : "FOCKUSTY" }; const : = { : 15 }; const : = { : "FOCKUSTY", : 15 }; /* Нормально, потому что оператор ИЛИ также позволяет совмещать значения, то есть в нём сочитается также оператор И. */

Итак, пересечения и объединения доступны только если Вы будете использовать type. Ничего сложного.

Наследование

// Типы type = { : string }; type = & { : number }; const : = { : "FOCKUSTY" }; const : = { : "FOCKUSTY", : 15 }; const : = { : "FOCKUSTY", age: 15
Object literal may only specify known properties, and 'age' does not exist in type 'Foo'.
};
// Интерфейсы interface Foo { : string }; interface Bar extends Foo { : number }; const : Foo = { : "FOCKUSTY" }; const : Bar = { : "FOCKUSTY", : 15 }; const : Foo = { : "FOCKUSTY", age: 15
Object literal may only specify known properties, and 'age' does not exist in type 'Foo'.
};

Итак, в interface наследование происходит только через extends, а в type только через &. К слову, можно наследовать type в interface и interface в type.

”Утверждение” типов (Type Assertions)

const = .("foo") as HTMLElement; const = <HTMLCanvasElement>.("bar");
const = "string" as number;
Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
const = "string" as unknown as number; // ok

Строковые типы (литерал)

let
let myString: string
myString
= "myString";
const
const someString: "someString"
someString
= "someString";
const
const otherString: "otherString"
otherString
= "otherString" as ;

Тут мы “создаём” тип литерала, то есть говоря, что эта переменная может иметь можем иметь только данный строковой литерал.

type = | "SomeString" | "OtherString" | "MyString" const : = "SomeString"; const : = "OtherString"; const : = "MyString"; const str4: = "NewString";
Type '"NewString"' is not assignable to type 'SomeStrings'.

Дженерики (начало)

см. Дженерики.

Работа с объектами

Здесь мы будем подробно разбирать, как работать с объектами в типах.

type < extends {[: string]: unknown}> = keyof ; const = { : "ceo", "Valentin Bird": "teamlead", : "manager", : "promoter", : "promoter" } as ; type
type Members = "FOCKUSTY" | "Valentin Bird" | "Adelya" | "beyz1k" | "Omonillo"
Members
= <typeof >;

Окей, keyof сам за себя говорит, что он принимает все ключи объекта, думаю, что тут нечего говорить. typeof, если Вы не видели, просто определяет тип переменной, а as const говорит, что данная переменная не можем измениться.

const
const MEMBERS: { readonly FOCKUSTY: "ceo"; readonly "Valentin Bird": "teamlead"; readonly Adelya: "manager"; readonly beyz1k: "promoter"; readonly Omonillo: "promoter"; }
MEMBERS
: {
readonly : "ceo"; readonly "Valentin Bird": "teamlead"; readonly : "manager"; readonly : "promoter"; readonly : "promoter"; } = { : "ceo", "Valentin Bird": "teamlead", : "manager", : "promoter", : "promoter" };
Last updated on