Создайте интерфейс для массива со свойствами

Можно ли создать интерфейс, отражающий тип, сгенерированный:

const foo = Object.assign([1,2,3], {offset: 4});

Я рассматривал:

interface Bar {
    [key: number]: number;
    offset: number;
}

Но я все еще получаю ошибки при доступе к прототипам массива (map/reduce/etc).

number[] & { offset: number }? Вы не можете получить доступ к методам массива, потому что вы предоставили только сигнатуру индекса, а не методы массива. Вам нужно пересечение с типом массива.
Andrew Li 09.07.2019 22:39
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
1
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, что ваш интерфейс 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 }?

Titian Cernicova-Dragomir 09.07.2019 22:41

если я продлеваю Array<Number>, [key: number]: number все еще необходим?

Bradd 09.07.2019 22:42

@TitianCernicova-Dragomir спасибо, ты прав. Кроме того, состав может быть более предпочтительным. Но это всего лишь ответ на поставленный вопрос.

falinsky 09.07.2019 22:43

@Брэдд, тогда ты можешь быть в порядке только с interface Bar extends Array<Number> { offset: number; }

falinsky 09.07.2019 22:45

@falinsky Я думаю, что OP использовал интерфейс, поскольку это распространено во многих языках, и, вероятно, не знает о пересечениях, поэтому мне кажется разумным предложить другое, более соответствующее языковому решению.

Titian Cernicova-Dragomir 09.07.2019 22:45

@TitianCernicova-Драгомир согласен. Не могли бы вы дать свой ответ, и я удалю свой?

falinsky 09.07.2019 22:47

@TobiasTengler запустить: console.info(Object.assign([1,2,3], {offset: 4})) и посмотреть результат. Это действительно работает. Массивы — это объекты, как и все остальное в JavaScript.

Bradd 09.07.2019 22:47

@falinsky, вы должны дополнить свой ответ, чтобы дать наиболее полное обоснование для будущих посетителей.

Bradd 09.07.2019 22:48

@falinsky Нет, вы отвечаете нормально, это в основном придирки, я не вижу причин давать еще один подобный ответ. Это будет так: typescriptlang.org/play/#code/…

Titian Cernicova-Dragomir 09.07.2019 22:51

проверьте консоль своего браузера @TobiasTengler, ваш результат связан с их парсером.

Bradd 09.07.2019 22:51

Другие вопросы по теме