I'm implementing a modular system to process user input, there are transformers to process correspond raw input, and return transformed data.
enum DataType {
Text = 'TEXT',
Image = 'IMAGE',
}
// text transformer module
interface TextInput {
type: DataType.Text,
text: string
}
interface TextOutput {
type: DataType.Text,
text: string
}
const TextTransformer = {
transform(input: TextInput): TextOutput {
return {
type: DataType.Text,
text: input.text,
}
}
}
// image transformer module
interface ImageInput {
type: DataType.Image,
url: string
}
interface ImageOutput {
type: DataType.Image,
url: string
width: number
height: number
}
const ImageTransformer = {
transform(input: ImageInput): ImageOutput {
return {
type: DataType.Image,
url: input.url,
width: 0,
height: 0,
}
}
}
// main module
const transformerMap = {
[DataType.Text]: TextTransformer,
[DataType.Image]: ImageTransformer,
}
type Input = TextInput | ImageInput
type Output = TextOutput | ImageOutput
function transform(inputs: Input[]): Output[] {
return inputs.map(input => {
const transformer = transformerMap[input.type]
return transformer.transform(input)
})
}
Now TypeScript will report error on the transformer.transform(input)
line:
Argument of type 'Input' is not assignable to parameter of type 'TextInput & ImageInput'.
You can play with the example here: