@Levingstoun

Как назначить классу/объекту два разных интерфейса с некоторыми общими типами?

Скажем, у меня есть два больших интерфейса и я хочу сделать так, чтобы один интерфейс дополнял другой. Возможно ли это без декомпозиции каждого из интерфейса на более мелкие и чтобы не делать тип необязательным через `?` ?

Реально интерфейсы могут быть гораздо больше, на десятки типов каждый, но вот условный пример, который даст такую ошибку

Type '{ select: string; items: number[]; }' is not assignable to type 'one | two'. Property 'data' is missing in type '{ select: string; items: number[]; }' but required in type 'two'


interface one {
    items: number[],
    item: string
}

interface two {
    select: string,
    data: object,
}


function g(): one | two {
    const items = [1];
    const select = '';
    return {
        select,
        items
    }
}
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
Kozack
@Kozack
Thinking about a11y
Вы получаете ошибку от того, что ваш код неверный.

Разберемся по порядку.

Вы описываете тип one как объект с двумя обязательными полями: items и item
Затем вы описываете второй тип two как объект с двумя обязательными полями: select и data

После чего вы говорите себе: "Эта функция должна возвращать или тип one или типtwo. Либо то либо то. ". А описываете функцию которая возвращает ни то ни другое.

Если у вас по программе могут гулять не атомарные типы а какие-то подмножества -- Делайте декомпозицию
Это вам поможет.
Для тех случаев, когда у вас есть функция которая генерирует какой-то кусок атомарного типа её можно описать с помощью Pick
И на худой конец, если уж очень чешется наговнокодить, можно написать так:
function g(): Pick<one, 'items'> & Pick<two, 'select'> {

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
у меня есть два больших интерфейса
Ваша главная ошибка в этом, интерфейсы должны быть минимальны и описывать тот минимум, который требуется в конкретном месте.

https://www.typescriptlang.org/docs/handbook/union...
Почитайте про юнионы, они работают совершенно не так как Вы планируете.

Ну и наконец, в typescript структурная типизация и он много где вполне неплохо выводит типы. В Вашем примере ts вполне может вычислить возвращаемый тип, и он подойдет везде, где требуется {select: string} и/или {items: number[]}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы