#typescript #discriminated-union #data-transform
#typescript #дискриминируемый-объединение #преобразование данных
Вопрос:
Я хочу передать типизированные данные из базы данных в общую функцию преобразования. Похоже, что лучший способ добиться этого в Typescript — использовать различающий союз. Но для этого требуется свойство дискриминанта. Есть ли способ автоматической генерации дискриминанта? Или есть ли способ написать общую функцию преобразования, используя что-то другое, кроме дискриминируемого объединения? Я открыт для других решений, помимо тех, которые я предлагаю ниже.
type DB1 = {
id: string
one: string
}
type DB2 = {
id: string
two: string
}
type One = {
id: number
one: string
}
type Two = {
id: number
two: string
}
function transformer(x: DB1): One
function transformer(x: DB2): Two
function transformer(x: DB1 | DB2): One | Two {
switch (x.kind) { // There is no x.kind!
case 'DB1': return db1ToOne(x)
case 'DB2': return db2ToTwo(x)
}
}
Проблема заключается в простом различении DB1 и DB2. Поскольку они поступают непосредственно из библиотеки базы данных, я сам не создаю экземпляры типов вручную, и поэтому у меня нет возможности «при создании» объектов вручную включить свойство дискриминанта. Мне также не очень нравится идея «взлома» DB1 и DB2 и привязки дискриминанта непосредственно перед тем, как я передам его преобразователю.
Есть ли способ различать эти типы, чтобы трансформатор работал так, как я хочу?
(Кроме того, поскольку предполагается, что это решение масштабируется до многих типов, не предполагайте, что есть что-то еще, кроме потенциального дискриминантного свойства, которое в противном случае может различать типы.)
Комментарии:
1. Как бы вы могли определить разницу между двумя разными типами, если у них нет дискриминантного свойства? В этом сценарии (
DB1
иDB2
) вы могли бы просто сказатьx
isDB1
, а неDB2
if'one' in x
. Однако, как вы ожидаете, что это будет работать для более сложных типов? Вам нужно что-то, что автоматически генерирует код, который различает два типа и добавляет соответствующее свойство дискриминанта?2. Да, @cherryblossom , это, по сути, то, что я ищу. Я также думаю, что в более широком смысле бывают случаи, когда не хотелось бы изменять подтипы типа объединения, но все же хотелось бы каким-то образом различать их. Внешние дискриминанты, автоматически сгенерированные внутренние дискриминанты и т. Д. Любопытно, есть ли у сообщества стратегии для этой ситуации.