Я пытаюсь написать файл определения Typescript для функции JavaScript, которую я прикрепил к Array.prototype
.
Array.js
/**
* Flattens the array recursively.
*
* @example
* [1, [2, 3]].flat() // => [1, 2, 3]
*
* @example
* [[1, [2, 3], [4, [5]]], 6].flat() // => [1, 2, 3, 4, 5, 6]
*/
Array.prototype.flat = function () {
return this.reduce((arr, val) => Array.isArray(val) ? arr.concat(val.flat()) : arr.concat(val), []);
}
flat()
работает наArray<T|S>
, где S
равно Array<T|S>
и возвращает Array<T>
.То есть он имеет рекурсивное определение, и все массивы соответствуют определению, так как [1, 2, 3].flat()
просто возвратит копию исходного массива.
Я новичок в TypeScript, но я понимаю, что по порядкуЧтобы получить преимущества файла определения TypeScript (а именно IntelliSense), определение метода должно быть в пределах interface Array<T>
.Если это так, есть ли способ наложить ограничение на T
для специализированной версии Array<T>
?
Если нет, как я могу определить интерфейс, который будет выбран для каждого массива И будет распознавать, когда массив соответствует рекурсивному определению?