Краткий пример того, как вы можете использовать интерфейсы маркеров в C# для эмуляции типов объединения.

Что такое тип соединения?

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

Языки имеют разные реализации этого, но наиболее распространенными реализациями являются объединения с тегами или объединения без тегов. Давайте посмотрим, как они выглядят в TypeScript, а затем как мы можем воспроизвести их в C# с помощью маркерных интерфейсов.

Теговые союзы

Объединение с тегами – это объединение, дискриминируемое тегом или свойством. В TypeScript это выглядит следующим образом:

Здесь тег «exerciseType», и мы можем видеть, как его можно использовать в защите типа «isStrengthExercise». Компилятор может вывести правильный тип из помеченного объединения по тегу. Исходя из этого, мы можем получить исчерпывающую реализацию функции CaloriesBurned, которая перечисляет все возможные применения объединения. Это позволяет нам красиво смоделировать нашу область. Это обычное дело в TypeScript, однако C# не имеет собственной реализации для этого. Однако мы можем воспроизвести функциональность через интерфейсы.

Это позволяет нам определить дискриминант на интерфейсе и использовать сопоставление с образцом для включения тега, однако этого также можно добиться с помощью наследования и других методов. Это имеет преимущество перед следующим типом объединения, поскольку его можно сериализовать через дискриминатор.

Объединения без тегов

Система типов TypeScript позволяет использовать немаркированные объединения, которые не имеют дискриминатора. Он делает это аналогичным образом посредством вывода типов, что позволяет его компилятору разбивать типы внутри объединения с помощью защиты типов или утверждений типов. Например:

Здесь мы видим, что защита типа утверждает тип на основе имеющихся полей. C# теперь может делать что-то подобное с помощью интерфейсов маркеров:

Здесь система типов C# позволяет нам делать утверждение типа, аналогичное разрешенному в TypeScript. Это можно рассматривать как псевдо- или фальшивую реализацию объединения. Эта концепция не совсем распространена, так как использует более новые возможности C#, однако ее можно увидеть в популярной библиотеке HotChocolate GraphQL. Эта функция может позволить нам ближе эмулировать разработку, управляемую типами, и другие функции, доступные для типов объединения.