#typescript
#typescript
Вопрос:
У меня есть интерфейс, который включает в себя массив самого себя в качестве дочерних элементов.
interface MyNestedInterface {
value: string;
children?: ReadonlyArray<MyNestedInterface>;
}
Теперь я хочу сделать так, чтобы объекты были только на один уровень глубже.
interface MyNestedInterface {
value: string;
children?: ReadonlyArray<Omit<MyNestedInterface, 'children'>>;
}
Наконец, я хочу расширить MyNestedInterface
.
interface ExtendedInterface extends MyNestedInterface {
id: string;
}
Однако, когда я пытаюсь создать его экземпляр с помощью an as const
, я получаю сообщение об ошибке для дочерних элементов, потому id
что не существует MyNestedInterface
.
const obj: Readonly<ExtendedInterface> = {
id: 'id1',
value: 'value1',
children: [
// Error: Object literal may only specify known properties, and 'id' does not
// exist in type 'Pick<MyNestedInterface, "value">'.
{ id: 'id2', value: 'value2' },
{ id: 'id3', value: 'value3' },
],
} as const;
Есть ли способ ссылаться this
на inside of MyNestedInterface
, чтобы он знал о расширенных свойствах, или какой-либо другой способ обойти это без повторного children
ExtendedInterface
объявления?
Ответ №1:
Да, это довольно просто сделать на самом деле, используя полиморфный this:
interface MyNestedInterface {
value: string;
children?: ReadonlyArray<Omit<this, 'children'>>;
}
Комментарии:
1. Rofl. Я не знал
this
, что он доступен как тип.