Codegen all you need to use ImmutableJS in your TypeScript application. Also uses type information to emit functions to parse nested Records.
With npm do:
npm install tsimmutable --save-dev
Write a file with your models (e.g. models.ts
):
export interface Profile {
firstName: string;
lastName: string;
}
export interface User {
profile: Profile;
login: string;
friends?: User[];
}
Compile it:
./node_modules/.bin/tsimmutable models.ts --out=models-imm.ts --indexerType=void --emitRecords --emitMarkers --emitEmptyRecords
See the output.
--out Output file name. Default: stdout
--keyType Emit map with Map<$keyType, ...> type. Default: "string"
--indexerType Emit map with Map<string, $indexerType> type. Default: "any"
--emitMaps Shoud emitter emit Maps? Default: true
--emitRecords Shoud emitter emit Records? Default: false
--emitMarkers Shoud emitter emit type markers? Default: false
--emitEmptyRecords Shoud emitter emit empty default records? Default: false
--emitTypedMethods Shoud emitter emit typed methods? Default: false
--defaultEmptyType Emit empty records with fields initializer by this value. Default: "null"
import { generate } from 'tsimmutable';
let result = generate(fileName, fileText, options);
tsimmutable
goes together with webpack plugin which
helps to watch and re-generate your model files when initial interface files change.
Usage:
var TsImmutablePlugin = require('tsimmutable/plugin');
module.exports = {
resolve: {
extensions: ['', '.ts', '.js']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'awesome-typescript-loader?module=common'
}
]
},
entry: {
index: ['./index.ts']
},
output: {
path: './dist',
filename: './[name].js'
},
plugins: [
new TsImmutablePlugin({
files: [
'./models.ts'
],
/*
* Every option below is optional.
*/
suffix: '-i',
verbose: true,
indexerType: 'any',
emitMaps: false,
emitRecords: true,
emitMarkers: true,
emitEmptyRecords: true,
emitTypedMethods: true,
defaultEmptyType: 'null'
})
]
};
- Inline object types will not work:
export interface User {
profile: {
a: User
};
}
- Two-dimensional array types will not work:
export interface User {
profile: User[][]
}
MIT