TypeScriptда женерик чекловларида типовой параметрлардан фойдаланиш

TypeScriptда шунингдек, бир типовой параметрни бошқа типовой параметр билан чеклаш имкони мавжуд. Бу объектнинг хоссаларини биттасидан иккинчисига нусхалаганда, ортиқча хосса ётқизмаслигимизга ишонч ҳосил қилиш зарур бўлганда қўлланилиши мумкин.

Келгила, қуйидаги мисолни кўриб чиқайлик. Яна ўзгарувчининг узунлигини аниқловчи myFunc функциясига қайтайлик:

typescriptfunction myFunc <T> (data: T): T {
  console.log(data.length); // хатолик
  return data;
}

Бирок, энди биз бу функция фақат length хоссасига эга бўлган типлар билан ишлашини истаймиз. Буни амалга ошириш учун ILength интерфейсини яратиб, унга length хоссасини рақамли типда белгилаймиз:

typescriptinterface ILength {
  length: number;
}

Кейин бизнинг функциямизда extends калит сузи орқали ILength дан мерос оладиган умумлашган типни белгилаймиз:

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' ]