#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 😀 что-то невозможно, но, согласно сообщению об ошибке и документам, это кажется невозможным