Если вы создадите тип объединения, а затем используете оператор 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 О, интересно, я не думал, что это возможно :-)
@jcalz Ого, спасибо! Это именно то, что мне нужно! Возможно ли это и при уничтожении объекта?
Я узнал, что он работает с разрушением объектов. Теперь еще один вопрос: можно ли сделать так, чтобы не приходилось вручную прописывать каждый ключ? Могу ли я сделать это более гибким?
Я не уверен; Цель этих комментариев — посмотреть, сможем ли мы ответить на заданный вопрос, а не отвечать на дополнительные вопросы. Я опубликую ответ здесь, когда у меня будет возможность, а затем, если у вас все еще останутся вопросы, вы сможете написать новый пост.
@GulgDev Пожалуйста, не уничтожайте свои объекты. Деструктурируйте их :-)
Один из подходов — использовать деструктурированный дискриминируемый союз , где вы назначаете переменные 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
соответственно сузятся.
Я могу представить, что делаю что-то вроде такого подхода; это соответствует вашим потребностям? Если да, то я напишу ответ с объяснением; если нет, то что мне не хватает?