Доступ к расширенному интерфейсу в базовом интерфейсе в TypeScript

#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 объявления?

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

Ответ №1:

Да, это довольно просто сделать на самом деле, используя полиморфный this:

 interface MyNestedInterface {
  value: string;
  children?: ReadonlyArray<Omit<this, 'children'>>;
}
  

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

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

1. Rofl. Я не знал this , что он доступен как тип.