Typescript: Как переопределить свойство в интерфейсе библиотеки с необязательного на обязательное

#typescript

Вопрос:

У меня есть интерфейс в библиотеке с дополнительным id полем:

 interface I {
  id?: string;
}
 

Я хочу переопределить его, чтобы он

 interface I {
  id?: string;
}
 

Поэтому я объявил модуль, переопределил интерфейс, но мне отказывает Typescript

 import { Option as BaseUiOption } from "baseui/select";

declare module "baseui/select" {
  export interface Option extends BaseUiOption {
    // trying to override
    readonly id: string | number;

    // extending is ok
    readonly idx: string | number;
  }
}

const x: BaseUiOption = { id: "a", idx: "a" };

x.id.toString(); // Object is possibly 'undefined'. ts(2532)
x.idx.toString();
 

Как я могу переопределить необязательность поля интерфейса библиотеки?

https://codesandbox.io/s/typescript-forked-9q12h?file=/src/index.ts

Ответ №1:

Пожалуйста, ознакомьтесь с документами

Нефункциональные элементы интерфейсов должны быть уникальными. Если они не уникальны, они должны быть одного типа. Компилятор выдаст ошибку, если оба интерфейса объявят нефункциональный элемент с одинаковым именем, но разных типов.

В вашем случае readonly id: string | number; не может быть присвоен readonly id?: string | number; , потому что тип другой.

Вы можете попробовать добавить другой интерфейс :

 import { OptionWithId } from "baseui/select";

declare module "baseui/select" {
  export interface OptionWithId extends Option {
    readonly id: string | number;
    readonly idx: string | number;
  }
}

const x: OptionWithId = { id: "a", idx: "a" };

x.id.toString(); // string | number
x.idx.toString(); // string | number
 

Игровая площадка

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

1. Хорошо, значит, этого невозможно достичь, верно? Мне нужно переопределить интерфейс, а не создавать другой, так как он не будет реализован библиотекой.

2. Я стараюсь быть очень осторожным, когда мне нужно сказать, что в TS 😀 что-то невозможно, но, согласно сообщению об ошибке и документам, это кажется невозможным