Можно ли объединить глобальную область видимости в TypeScript?

Если вы создадите тип объединения, а затем используете оператор if для идентификации его типа, TypeScript позволит вам использовать свойства и функции, специфичные для этого типа:

type A = {
    type: "A",
    func(): void
};

type B = {
    type: "B"
};

type Union = A | B;

const test: Union = ...;

test.func(); // Error: func does not exist on type B

if (test.type === "A")
    test.func(); // Works fine

Можно ли сделать это объединение глобально, объединив две области видимости? Что-то вроде этого было бы очень хорошо:

declare global {
    environment: "A",
    funcA(): void
} | {
    environment: "B",
    funcB(): void
}

funcA(); // Doesn't work (environment could be B, and B doesn't have funcA)

if (environment === "A")
    funcA(); // Works (environment is A)
else
    funcB(); // Works (environment is B)

Я пытался найти это, но не смог найти ничего, что соответствовало бы моим потребностям. Есть ли какой-либо конкретный синтаксис или какие-либо обходные пути?

Я могу представить, что делаю что-то вроде такого подхода; это соответствует вашим потребностям? Если да, то я напишу ответ с объяснением; если нет, то что мне не хватает?

jcalz 01.07.2024 00:00

@jcalz О, интересно, я не думал, что это возможно :-)

Bergi 01.07.2024 00:06

@jcalz Ого, спасибо! Это именно то, что мне нужно! Возможно ли это и при уничтожении объекта?

GulgDev 01.07.2024 09:48

Я узнал, что он работает с разрушением объектов. Теперь еще один вопрос: можно ли сделать так, чтобы не приходилось вручную прописывать каждый ключ? Могу ли я сделать это более гибким?

GulgDev 01.07.2024 10:23

Я не уверен; Цель этих комментариев — посмотреть, сможем ли мы ответить на заданный вопрос, а не отвечать на дополнительные вопросы. Я опубликую ответ здесь, когда у меня будет возможность, а затем, если у вас все еще останутся вопросы, вы сможете написать новый пост.

jcalz 01.07.2024 11:45

@GulgDev Пожалуйста, не уничтожайте свои объекты. Деструктурируйте их :-)

Bergi 01.07.2024 14:11
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из подходов — использовать деструктурированный дискриминируемый союз , где вы назначаете переменные environment, funcA и funcB как деструктурированные из объекта типа дискриминируемого союза. Вот пример использования кортежа:

declare const
    [environment, funcA, funcB]:
        ["A", () => void, undefined] |
        ["B", undefined, () => void];

funcA(); // error!
if (environment === "A") {
    funcA(); // okay
} else {
    funcB(); // okay
}

Это работает, потому что environment считается дискриминантным свойством дискриминируемого союза. Когда вы отметите это, то funcA и funcB соответственно сузятся.

Детская площадка, ссылка на код

Другие вопросы по теме