Здесь нет единой лучшей практики.Это зависит от того, что map
делает, и семантики, которую вы хотите, чтобы она имела.
Одна точка данных, которую следует учитывать конкретно в отношении операции, обычно называемой map
, например, операция над массивом (и для filter
, slice
и т. Д.): По умолчанию реализация в массиве будет возвращать B
(без какой-либо специальной работы с вашей стороны).Но реализация может переопределить это поведение по умолчанию, если имеет больше смысла возвращать A
.
Пример, использующий поведение по умолчанию в массиве (в JavaScript, но в TypeScript оно работает так же):
class B extends Array {
}
const b1 = new B("a", "b", "c");
const b2 = b1.map(entry => entry.toUpperCase());
console.log(b2 instanceof Array); // true
console.log(b2 instanceof B); // true
Пример переопределения поведения массива по умолчанию (опять же, в JS):
class B extends Array {
static get [Symbol.species]() {
return Array;
}
}
const b1 = new B("a", "b", "c");
const b2 = b1.map(entry => entry.toUpperCase());
console.log(b2 instanceof Array); // true
console.log(b2 instanceof B); // false
Подробнее о том, как это работает: Symbol.species
Promise
делает то же самое (и Map
иSet
) для операций, которые приводят к новому обещанию (или карте или набору), так что вы можете утверждать, что есть некоторая стандартная поддержка библиотеки для идеи возврата B
из аналогичных операций.
Илитолько разработчик может вернуть A или B (т. е. с перезаписью метода).
Исправить.