Выкарыстанне тыпавых параметраў у абмежаваннях джэнерiкаў у TypeScript
Таксама ў TypeScript ёсць магчымасць аб'яўлення аднаго тыпавога параметра, які будзе абмежаваны іншым тыпавым параметрам. Гэта неабходна, калі даводзіцца капіяваць уласцівасці з аднаго аб'екта ў іншы, пры гэтым застрахавацца ад таго, што мы не перададзім лішнюю ўласцівасць.
Давайце разгледзім наступны прыклад. Зноў
вернемся да функцыі myFunc, якая вызначае
даўжыню зменнай:
function myFunc <T> (data: T): T {
console.log(data.length); // памылка
return data;
}
Аднак цяпер мы хочам, каб дадзеная функцыя
працавала толькі з тымі тыпамі, у якіх
ёсць уласцівасць length. Для гэтага зробім
інтэрфейс ILength, якому зададзім
уласцівасць length лікавага тыпу:
interface ILength {
length: number;
}
Далей у нашай функцыі зададзім абагульнены
тып, які наследуе ад ILength
праз ключавое слова extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Вось так выглядае наш поўны код:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Давайце праверым працу нашай функцыі і знойдзем даўжыню радка:
console.log(myFunc('abcde'));
Вынік выкананага кода:
5
'abcde'
А цяпер перададзім у параметр масіў:
console.log(myFunc(['a', 'b', 'c']));
Вынік выкананага кода:
3
[ 'a', 'b', 'c' ]