1. Для того, чтобы union объектов работал, в каждом объекте должно быть поле-дискриминатор, которое отличает его от других объектов. В нашем случае это поле "type".
2. В типе BaseColumn у нас есть общие поля для всех объектов, такие как "label" и "props".
3. Тип Column представляет объекты с полем "type" равным "text" и наследует поля из BaseColumn.
4. Тип LinkColumn представляет объекты с полем "type" равным "link" и дополнительным полем "path", также наследует поля из BaseColumn.
5. Тип TableColumn представляет объединение типов Column и LinkColumn. Используя оператор keyof, мы можем получить только те поля, которые присутствуют в обоих типах. Это объясняется тем, что при обращении к типу TableColumn мы не знаем заранее, будет ли он иметь поле "link" или нет.
6. Обратите внимание, что union типы в TypeScript являются строгими, что означает, что объекты должны полностью соответствовать типу, заданному в объединении.