Можно ли создать интерфейс, отражающий тип, сгенерированный:
const foo = Object.assign([1,2,3], {offset: 4});
Я рассматривал:
interface Bar {
[key: number]: number;
offset: number;
}
Но я все еще получаю ошибки при доступе к прототипам массива (map/reduce/etc).






Кажется, что ваш интерфейс Bar может быть расширением Array класса:
const foo = Object.assign([1,2,3], {offset: 4});
interface Bar extends Array<Number> {
offset: number;
}
function test(a: Bar) {
console.info(a[0]);
console.info(a.length);
console.info(a.concat);
}
test(foo);
Вы можете узнать больше о Интерфейсы, расширяющие классы
Обновлено: На самом деле вы можете создать отдельный тип, используя пересечения, вместо того, чтобы создавать отдельный интерфейс:
const foo = Object.assign([1,2,3], {offset: 4});
type Bar = number[] & {offset: number};
function test(a: Bar) {
console.info(a[0]);
console.info(a.length);
console.info(a.concat);
}
test(foo);
Этот интерфейс кажется излишним, почему бы просто не использовать пересечение type Bar = number[] & { offset : number }?
если я продлеваю Array<Number>, [key: number]: number все еще необходим?
@TitianCernicova-Dragomir спасибо, ты прав. Кроме того, состав может быть более предпочтительным. Но это всего лишь ответ на поставленный вопрос.
@Брэдд, тогда ты можешь быть в порядке только с interface Bar extends Array<Number> { offset: number; }
@falinsky Я думаю, что OP использовал интерфейс, поскольку это распространено во многих языках, и, вероятно, не знает о пересечениях, поэтому мне кажется разумным предложить другое, более соответствующее языковому решению.
@TitianCernicova-Драгомир согласен. Не могли бы вы дать свой ответ, и я удалю свой?
@TobiasTengler запустить: console.info(Object.assign([1,2,3], {offset: 4})) и посмотреть результат. Это действительно работает. Массивы — это объекты, как и все остальное в JavaScript.
@falinsky, вы должны дополнить свой ответ, чтобы дать наиболее полное обоснование для будущих посетителей.
@falinsky Нет, вы отвечаете нормально, это в основном придирки, я не вижу причин давать еще один подобный ответ. Это будет так: typescriptlang.org/play/#code/…
проверьте консоль своего браузера @TobiasTengler, ваш результат связан с их парсером.
number[] & { offset: number }? Вы не можете получить доступ к методам массива, потому что вы предоставили только сигнатуру индекса, а не методы массива. Вам нужно пересечение с типом массива.