Выкарыстанне тыпавых параметраў у абмежаваннях джэнерiкаў у TypeScript

Таксама ў TypeScript ёсць магчымасць аб'яўлення аднаго тыпавога параметра, які будзе абмежаваны іншым тыпавым параметрам. Гэта неабходна, калі даводзіцца капіяваць уласцівасці з аднаго аб'екта ў іншы, пры гэтым застрахавацца ад таго, што мы не перададзім лішнюю ўласцівасць.

Давайце разгледзім наступны прыклад. Зноў вернемся да функцыі myFunc, якая вызначае даўжыню зменнай:

typescriptfunction myFunc <T> (data: T): T {
  console.log(data.length); // памылка
  return data;
}

Аднак цяпер мы хочам, каб дадзеная функцыя працавала толькі з тымі тыпамі, у якіх ёсць уласцівасць length. Для гэтага зробім інтэрфейс ILength, якому зададзім уласцівасць length лікавага тыпу:

typescriptinterface ILength {
  length: number;
}

Далей у нашай функцыі зададзім абагульнены тып, які наследуе ад ILength праз ключавое слова extends:

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Вось так выглядае наш поўны код:

typescriptinterface ILength {
  length: number;
}

function myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Давайце праверым працу нашай функцыі і знойдзем даўжыню радка:

typescriptconsole.log(myFunc('abcde'));

Вынік выкананага кода:

typescript5
'abcde'

А цяпер перададзім у параметр масіў:

typescriptconsole.log(myFunc(['a', 'b', 'c']));

Вынік выкананага кода:

typescript3
[ 'a', 'b', 'c' ]