Я хочу, чтобы типы моих редукционных действий были статически типизированы, поэтому я могу извлечь выгоду из обнаружения опечаток, автозаполнения и т. Д. В коде, который имеет дело с такими действиями, как редукторы и т. Д.
Чтобы это работало хорошо, мне действительно нужно статически набирать структуру каждого действия в моем приложении, вот так
type Actions =
| { type: 'A_PENDING' }
| { type: 'A_FULFILLED', payload: { a: number } }
| { type: 'A_REJECTED', error: Error }
| { type: 'B_PENDING' }
| { type: 'B_FULFILLED', payload: { b: number } }
| { type: 'B_REJECTED', error: Error }
| { type: 'C_PENDING' }
| { type: 'C_FULFILLED', payload: { c: number } }
| { type: 'C_REJECTED', error: Error }
Тем не менее, есть много повторений в написании этих типов для всех моих действий.
Я знаю, что могу писать шаблоны редакторов, чтобы буквально генерировать этот код для меня, но мне было интересно, есть ли какой-нибудь "нативный" способ TS для генерации таких шаблонов определений типов.
Я бы вообразил синтаксис примерно так (псевдокод)
typegenerator AsyncAction = (BaseString, PayloadType) =>
| { type: BaseString + '_PENDING' }
| { type: BaseString + '_FULFILLED' }, payload: PayloadType }
| { type: BaseString + '_REJECTED' }, error: Error }
type Actions =
| AsyncAction('A', { a: number })
| AsyncAction('B', { b: number })
| AsyncAction('C', { c: number })
Существует ли что-нибудь подобное, или мне лучше просто делать генерацию буквального кода?