Yandex.Metrika Counter

Начать работать с нами легко! Просто заполните заявку, и мы свяжемся с вами для обсуждения деталей.

Бюджет

НаТимая Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π²Ρ‹ Π΄Π°Ρ‘Ρ‚Π΅ согласиС Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΡΠΎΠ³Π»Π°ΡˆΠ°Π΅Ρ‚Π΅ΡΡŒ с ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

НСочСвидныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ TypeScript ΠΈ ΡΠΏΠΎΡΠΎΠ±Ρ‹ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Β·

ΠžΠ³Ρ€ΠΎΠΌΠ½Π°Ρ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ Π·Π° Β ΡΠΎΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Β ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² Β ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π”ΠΌΠΈΡ‚Ρ€ΠΈΡŽ Π‘Π΅Ρ€Π΄Π½ΠΈΠΊΠΎΠ²Ρƒ ΠΈ Β ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ€Ρƒ Π˜Π½ΠΊΠ΅Π΅Π²Ρƒ!

Если Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ сразу ТС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, читая ΡΡ‚Π°Ρ‚ΡŒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Β Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅. Он Β ΡƒΠ΄ΠΎΠ±Π΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ€ΡΠΈΡŽ TypeScript Π² Β Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ any Π²ΠΌΠ΅ΡΡ‚ΠΎ unknown

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏ any, Ρ‚ΠΎ Β Ρ‚СряСм Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽΒ β€” ΠΌΡ‹ Β ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Β Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΈΠ»ΠΈ ΡΠ²ΠΎΠΉΡΡ‚Π²Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ Β ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ Β ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ нас ΠΎ Β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Если ТС ΠΌΡ‹ Β ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ unknown, Ρ‚ΠΎ Β ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ подскаТСт ΠΎ Β Π½ΠΈΡ….

НСкоторыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Β ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ any ΠΏΠΎ Β ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ β€” это Π½Π΅ Β ΡΠΎΠ²ΡΠ΅ΠΌ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π²ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:


// JSON.parse
const a = JSON.parse('{ a: 1 }'); // any 
// Array.isArray
function parse(a: unknown) {
if (Array.isArray(a)) {
console.log(a); // a[any]
}
}
// fetch
fetch("/")
.then((res) => res.json())
.then((json) => {
console.log(json); // any 
});
// localStorage, sessionStorage
const b = localStorage.a; // any 
const c = sessionStorage.b // any

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒΒ ts-reset.Β 

ts-reset – это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ TypeScript ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈΠ½Π°Ρ‡Π΅.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ массивов слишком строгиС для ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ as const

Π’Π°ΠΊΠΆΠ΅ это Π²ΡΡ‚рСчаСтся Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… has Ρƒ Set ΠΈ Map.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: создаСм массив ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, присваиваСм ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ as const, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ includes ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ 4 Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π² Ρ‚ΠΈΠΏΠ΅ userIds.


const userIds = [1, 2, 3] as const;

userIds.includes(4);

Π˜Π·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΡˆΠΈΠ±ΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ использованиС ts-reset.

ΠžΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ массив ΠΎΡ‚ undefined

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ Π½Π°Ρ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ‑Ρ‚ΠΎ Ρ‡ΠΈΡΠ»ΠΎΠ²ΠΎΠΉ массив, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ undefined. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΡΡ‚ΠΈΡ… undefined, ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ массив. Но ΠΌΠ°ΡΡΠΈΠ² newArr всё Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΌΠ°ΡΡΠΈΠ²Π° number ΠΈΠ»ΠΈ undefined.


const arr = [1, 2, undefined];
const newArr = arr.filter((item) => item !== undefined);

Π Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎΠ³Π΄Π° newArr2 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ number:


const newArr2 = arr.filter((item): item is number => item !== undefined);

Π’Π°ΠΊΠΆΠ΅ ts-reset ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΡΠ»ΡƒΡ‡Π°Ρ, ΠΊΠΎΠ³Π΄Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ filter являСтся Ρ‚ΠΈΠΏΠΎΠΌ BooleanConstructor.


const filteredArray = [1, 2, undefined].filter(Boolean)

Π‘ΡƒΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скобочной Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠ»ΡŽΡ‡ строка, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строка ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² строк.Β 

Π—Π°Ρ‚Π΅ΠΌ обращаСмся ΠΊ ΡΠ²ΠΎΠΉΡΡ‚Π²Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΊΠΎΠ±ΠΎΡ‡Π½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° являСтся строкой. Π’ typescript вСрсии Π½ΠΈΠΆΠ΅ 4.7 Ρ‚ΠΈΠΏ queryCountry Π±ΡƒΠ΄Π΅Ρ‚ строкой ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ строк, Ρ‚.Π΅. автоматичСскоС суТСниС Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, хотя ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ условиСм.Β 

Если ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ typescript вСрсии 4.7 ΠΈ Π²Ρ‹ΡˆΠ΅, суТСниС Ρ‚ΠΈΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡΡ‚ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ.


const query: Record<string, string | string[]> = {};

const COUNTRY_KEY = 'country';

if (typeof query[COUNTRY_KEY] === 'string') {
    const queryCountry: string = query[COUNTRY_KEY];
}

Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.Β 

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ enum

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ enum ΠΈ ΡΠ²Π½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ значСния, Ρ‚ΠΎΠ³Π΄Π° Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΏΠΎ ΠΏΠΎΡ€ΡΠ΄ΠΊΡƒ Π±ΡƒΠ΄ΡƒΡ‚ числовыС значСния ΠΎΡ‚ 0 ΠΈ Π΄Π°Π»Π΅Π΅.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого enum Π·Π°Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ showMessage, Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описаны Π² enum:


enum LogLevel {
    Debug, // 0
    Log, // 1
    Warning, // 2
    Error // 3
}

const showMessage = (logLevel: LogLevel, message: string) => {
    // code...
}

showMessage(0, 'debug message');
showMessage(2, 'warning message');

Если ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰Π΅Π΅ΡΡ Π² enum Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ "Argument of type '-100' is not assignable to parameter of type 'LogLevel'". Но Π² typescript Π½ΠΈΠΆΠ΅ вСрсии 5.0 Ρ‚Π°ΠΊΠΎΠΉ ошибки Π½Π΅Ρ‚, хотя ΠΏΠΎ Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ:Β 


showMessage(-100, 'any message')

Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ enum ΠΈ ΡΠ²Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ числовыС значСния. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π΅ a ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΈΠΏ enum ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ любоС Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Π² enum, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1. ΠŸΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ TS Π½ΠΈΠΆΠ΅ 5 вСрсии ошибки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.


enum SomeEvenDigit {
    Zero = 0,
    Two = 2,
    Four = 4
}

const a: SomeEvenDigit = 1;

И Π΅Ρ‰Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ TypeScript Π½ΠΈΠΆΠ΅ 5 вСрсии, вычисляСмыС значСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² enum.


enum User {
  name = 'name',
    userName = `user${User.name}`
}

Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… явно ΡƒΠΊΠ°Π·Π°Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ undefined, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ явный Π²ΠΎΠ·Π²Ρ€Π°Ρ‚

Π’ вСрсиях TypeScript Π½ΠΈΠΆΠ΅ 5.1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ошибка Π² ΡΠ»ΡƒΡ‡Π°ΡΡ…, ΠΊΠΎΠ³Π΄Π° Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ явно ΡƒΠΊΠ°Π·Π°Π½ Ρ‚ΠΈΠΏ undefined, Π½ΠΎ Π½Π΅Ρ‚ return.


function f4(): undefined {}

Ошибки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях:


function f1() {}

function f2(): void {}

function f3(): any {}

Π—Π°ΠΊΡ€Π΅ΠΏΠΈΠΌ. Если явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏ void ΠΈΠ»ΠΈ any, ошибки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Она ΠΏΠΎΡΠ²ΠΈΡ‚ся, Ссли ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏ undefined, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ TypeScript вСрсии Π½ΠΈΠΆΠ΅ 5.1.

Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

ПовСдСниС enum’ов соотвСтствуСт Π½ΠΎΠΌΠΈΠ½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π½Π΅ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½ΠΎΠΉ

И это Π½Π΅ΡΠΌΠΎΡ‚ря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ TypeScript типизация, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, структурная.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ enum ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ этим enum. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ значСния этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° строку, которая ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ enum. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² showMessage Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° 'Debug' Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСн, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ся Ρ‚ΠΈΠΏ enum 'LogLevel'.


enum LogLevel {
    Debug = 'Debug',
    Error = 'Error'
}

const showMessage = (logLevel: LogLevel, message: string) => {
    // code...
}

showMessage('Debug', 'some text')

Π”Π°ΠΆΠ΅ Ссли ΠΌΡ‹ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ enum с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡΠΌΠΈ, это Π½Π΅ ΡΡ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.


enum LogLevel2 {
    Debug = 'Debug',
    Error = 'Error'
}
showMessage(LogLevel2.Debug, 'some text')

РСшСниС – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ as const.


const LOG_LEVEL = {
    DEBUG: 'debug',
    ERROR: 'error'
} as const

type ObjectValues = T[keyof T]

type LogLevel = ObjectValues;

const logMessage = (logLevel: LogLevel, message: string) => {
    // code...
}

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибки, вСдь Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с ΠΏΡ€ΠΎΡΡ‚Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΈ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ся.


logMessage('debug', 'some text')
logMessage(LOG_LEVEL.DEBUG, 'some text')

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ строку, Ссли 2 Π΅Ρ‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ строками. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ провСряСм, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈ Π½Π°ΡˆΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ строками. ΠŸΡ€ΠΈ ΡΡ‚ΠΎΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ любой Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС Π±Ρ‹Π»Π° ΡƒΠΊΠ°Π·Π°Π½Π° строка.


function add(x: string, y: string): string
function add(x: number, y: number): number
function add(x: unknown, y: unknown): unknown {

    if (typeof x === 'string' && typeof y === 'string') {
                return 100;
    }

    if (typeof x === 'number' && typeof y === 'number') {
        return x + y 
    }

    throw new Error('invalid arguments passed');
}

Π”Π°Π»Π΅Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ const Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΈΠΏ string, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ число.


const str = add("Hello", "World!");
const num = add(10, 20);

Β 

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π»ΠΈΡˆΠ½ΠΈΠΌ свойством

Випизируя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ лишниС свойства, Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Ρ‚ΠΈΠΏΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚СрфСйсС ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ. Π’Π΅Π΄ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ ΠΏΡ€ΠΎΡΡ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΄Ρ€ΡƒΠ³ΡƒΡŽ структуру Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Однако Π² typescript Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:


type Func = () => {
  id: string;
};

const func: Func = () => {
  return {
    id: "123",
    name: "Hello!",
  };
};

Для большСй наглядности, создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠ°ΠΌΠΈ formatAmountParams, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ formatAmount. Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½Π°ΡΡ‚Ρ€ΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ лишниС свойства ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.


type FormatAmount = {
  currencySymbol?: string,
  value: number
}

const formatAmount = ({ currencySymbol = '$', value }: FormatAmount) => {
  return `${currencySymbol} ${value}`;
}

const formatAmountParams = {
  currencySymbol: 'USD',
  value: 10,
  anotherValue: 20
}

НСт ошибки, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит лишниС свойства:Β 


formatAmount(formatAmountParams);

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ с Π»ΠΈΡˆΠ½ΠΈΠΌ свойством.


formatAmount({ currencySymbol: '', value: 10, anotherValue: 12 });

МоТСм ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ, Ссли Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ currencySymbol Π½Π° currencySign.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π² Ρ‚ΠΈΠΏΠ΅, Π·Π°Ρ‚Π΅ΠΌ typescript подскаТСт, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ с Β  currencySymbol Π½Π° currencySign.


type FormatAmount = {
  currencySign?: string,
  value: number
}

const formatAmount = ({ currencySign = '$', value }: FormatAmount) => {
  return `${currencySign} ${value}`;
}

const formatAmountParams = {
  currencySymbol: 'USD',
  value: 10
}

formatAmount(formatAmountParams);

Ошибок Π½Π΅Ρ‚ β€“ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΡˆΠ΅Π» Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Но Π² formatAmountParams ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ староС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ currencySymbol ΠΈ Π²ΠΌΠ΅ΡΡ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° 'USD 10' ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ $10'.Β 

ΠŸΠΎΡ‚Π΅Ρ€Ρ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Object.keys

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ obj. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Object.keys создадим массив с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΡ€ΠΎΠΈΡ‚СрируСмся ΠΏΠΎ ΡΡ‚ΠΎΠΌΡƒ массиву. Если Π² Ρ†ΠΈΠΊΠ»Π΅ обратимся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, typescript скаТСт, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚ΠΈΠΏ 'string' Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΊΠ»ΡŽΡ‡Π° для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° obj.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ – ΡΠΊΠ°ΡΡ‚ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции as. Но ΡΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСбСзопасно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ устанавливаСм, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ. НуТно привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ [key] Π±Ρ‹Π» Π½Π΅ ΠΏΡ€ΠΎΡΡ‚ΠΎ строкой, Π° ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΈ ΡΠ²Π½ΠΎ это ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ.


const obj = {a: 1, b: 2}

Object.keys(obj).forEach((key) => {
  console.log(obj[key])
  console.log(key as keyof typeof obj)
});

Β 

TypeScript ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ‚ΠΈΠΏ UserMetadata, ΠΊΠ°ΠΊ Map ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. На ΠΎΡΠ½ΠΎΠ²Π΅ этого Ρ‚ΠΈΠΏΠ° создаём cache ΠΈ ΠΏΡ‹Ρ‚аСмся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ 'foo' с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° get. Всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ся.

Π—Π°Ρ‚Π΅ΠΌ создадим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ cacheCopy Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ cache. И Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ get. Typescript Π½Π΅ ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ‑Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ошибка, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° get.


type Metadata = {};

type UserMetadata = Map<string, Metadata>;

const cache: UserMetadata = new Map();

console.log(cache.get('foo'));

const cacheCopy: UserMetadata = { ...cache };

console.log(cacheCopy.get('foo'));

Β 

ΠœΠ΅Ρ€ΠΆ интСрфСйсов

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒΡΡ. Если Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±ΡƒΠ΄ΡƒΡ‚ интСрфСйсы с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ названиями, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Π·Π½Π°Ρ‡ΠΈΠΌ этот интСрфСйс ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ свойства ΠΈΠ· Π²ΡΠ΅Ρ… интСрфСйсов с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ названиями.


interface User {
    id: number;
}

interface User {
    name: string;
}

// Error: Property 'id' is missing in type '{ name: string; }' but required in type 'User', because User interfaces merged
const user: User = {
    name: 'bar',
}

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Ρƒ Π½Π°Ρ Π΅ΡΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ интСрфСйсы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΡΠ°ΠΌΠΎΠΌ typescript, ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ смСрТатся. НапримСр, Ссли создадим интСрфСйс с ΠΈΠΌΠ΅Π½Π΅ΠΌ comment, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΌΠ΅Ρ€ΠΆ интСрфСйсов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ comment ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π² lib.dom.d.ts.


interface Comment {
  id: number;
  text: string;
}

// Error: Type '{ id: number; text: string; }' is missing the following properties from type 'Comment': data, length, ownerDocument, appendData, and 59 more.
const comment: Comment = {
  id: 5,
  text: "good video!",
};

Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

Π•Ρ‰Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅

Если Π²Π°ΠΌ Ρ…очСтся Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅, Π½ΠΎ Π½Π΅ Ρ…очСтся ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ нСсколько Ρ€ΠΎΠ»ΠΈΠΊΠΎΠ² Π½Π° youtube: