ტიპის პარამეტრების გამოყენება ჯენერიკების შეზღუდვებში 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' ]