Создания своих типов
Чтобы создать свой тип, мы можем использовать следующие ключевые слова: 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};// Интерфейсы
interface Foo {
: string
};
interface Bar extends Foo {
: number
};
const : Foo = {
: "FOCKUSTY"
};
const : Bar = {
: "FOCKUSTY",
: 15
};
const : Foo = {
: "FOCKUSTY",
age: 15};Итак, в interface наследование происходит только через extends, а в type только через &. К слову, можно наследовать type в interface и interface в type.
”Утверждение” типов (Type Assertions)
const = .("foo") as HTMLElement;
const = <HTMLCanvasElement>.("bar");const = "string" as number;const = "string" as unknown as number; // okСтроковые типы (литерал)
let let myString: stringmyString = "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 < 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"
};