Typescript: тип, который имеет все базовые атрибуты и допускает любые расширения - PullRequest
0 голосов
/ 21 февраля 2019

Предположим, у меня есть интерфейс, который описывает только те поля, которые меня интересуют:

interface RestResponse {
    data: {
        name: string;
        value: number;
    }
    status: number;
}

Я хотел бы использовать этот интерфейс в качестве типа для реального ответа REST, в котором больше полей, чем указано выше.,Например:

const sampleResponse = {
    data: {
        name: 'cat',
        value: 64,
        description: 'the field I won't use anywhere'
    }
    status: 200,
    isSuccessful: true
}

Вопрос в том, какой тип sampleResponse должен быть?Я не могу сделать это:

const sampleResponse: RestResponse = { ... }

, потому что тип не имеет полей типа isSuccessful и data.description.

Это расширение RestResponse.Я ожидаю, что в нем будут все поля, указанные в интерфейсе, но не возражаю против дополнительных полей.


До сих пор я пытался посмотреть на https://www.typescriptlang.org/docs/handbook/advanced-types.html,, но ничего не могу найтиполезно для этого случая.

1 Ответ

0 голосов
/ 21 февраля 2019

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

Это будет выглядеть так:

interface RestResponse {
  data: { 
    name: string;
    value: number;
  } 
  status: number;
  [key: string]: any;
}

Что такое индексатор типов?

[key: string]: any - это индексатор объекта.

[key: string] указывает, что вы можете добавить любой ключ к объекту типа string

: any после индексатора определяет, что значениеключ должен быть any, а поскольку any позволяет все - вы можете добавить что угодно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...