Как условно удалить свойство из интерфейса в Typescript

#typescript

Вопрос:

 interface Info<
  BodyType = undefined,
  QueryStringType = undefined,
  PathParamType = undefined,
  ResponseType = undefined
> {
  request: {
    queryStrings: QueryStringType;
    pathParameters: PathParamType;
    body: BodyType;
  };
  response: ResponseType;
}

type InfoExtend = Info<{ name: string }>;

const a1: InfoExtend = {
  request: {
    body: { name: "a" },
  },
};
 

У меня есть Info тип, который является интерфейсом для описания конечной точки, и InfoExtend это фактический тип для реализации конечной точки.

Проблема в том, a1 что у него ошибка типа:

Тип «{ тело: { имя: строка;};} «не содержит следующих свойств типа» {Строки запросов: не определены; Параметры пути: не определены; тело: { имя: строка;};}»: Строки запросов, параметры пути(2739)

Я понимаю это, потому queryStrings pathParameters что и. не являются необязательными

Вопрос в том, могу ли я сделать body , queryStrings и pathParameters связанный с общим, таким образом, что, если я передам BodyType общий , то body будет Info.request.body , если я не передам BodyType , то Info.request не должно быть никаких ошибок, и он должен содержать 1 из 3 (тело/строка запроса/параметры пути)

Ссылка на игровую площадку:

Ответ №1:

Вы можете решить эту проблему, сделав отсутствующие поля такими optional :

 interface Info<
  BodyType = undefined,
  QueryStringType = undefined,
  PathParamType = undefined,
  ResponseType = undefined
> {
  request: {
    queryStrings?: QueryStringType;
    pathParameters?: PathParamType;
    body: BodyType;
  };
  response?: ResponseType;
}

type InfoExtend = Info<{ name: string }>;

const a1: InfoExtend = {
  request: {
    body: { name: "a" },
  },
};
 

Ссылка на игровую площадку

Комментарии:

1. Спасибо, но они все еще есть в окончательном типе, если вы наберете a1.request., то queryStrings появятся, но они мне там не нужны, если я не передам их общий тип. Возможно ли это с текущими TS?

2. Но в какой-то момент вам не нужно queryString , pathParameters , и response ? Теперь они являются необязательными полями, что означает, что они не требуются для request . (Возможно, я неправильно понял ваш комментарий)