This page contains some examples of how Typewriter can be used.
This example creates typed model interfaces.
module Models { $Classes(*Model)[
export interface $Name$TypeParameters { $Properties[
$name: $Type;]
}]
}
This example creates typed models with recursive mapping from JSON objects for Knockout.js.
${
using Typewriter.Extensions.Types;
string KnockoutInitializer(Property property)
{
var type = property.Type;
return type.IsEnumerable ?
$"KnockoutObservableArray<{type.Name.TrimEnd('[', ']')}> = ko.observableArray<{type.Name.TrimEnd('[', ']')}>({type.Default()})" :
$"KnockoutObservable<{type.Name}> = ko.observable<{type.Name}>({type.Default()})";
}
string TypeMap(Property property)
{
var type = property.Type;
if (type.IsPrimitive)
{
return type.IsDate ?
$"new Date(data.{property.name})" :
$"data.{property.name}";
}
else
{
return type.IsEnumerable ?
$"data.{property.name}.map(i => new {type.Name.TrimEnd('[', ']')}(i))" :
$"new {type.Name}(data.{property.name})";
}
}
}
module App { $Classes(*Model)[
export class $Name {
$Properties[
public $name: $KnockoutInitializer;]
constructor(data: any = null) {
if (data !== null) { $Properties[
this.$name($TypeMap);]
}
}
}]
}
This example creates typed services for accessing ASP.NET Web API controllers for Angular.js.
${
using Typewriter.Extensions.WebApi;
string ReturnType(Method m) => m.Type.Name == "IHttpActionResult" ? "void" : m.Type.Name;
string ServiceName(Class c) => c.Name.Replace("Controller", "Service");
}
module App { $Classes(:ApiController)[
export class $Name {
constructor(private $http: ng.IHttpService) {
} $Methods[
public $name = ($Parameters[$name: $Type][, ]) : ng.IHttpPromise<$ReturnType> => {
return this.$http<$ReturnType>({
url: `$Url`,
method: "$HttpMethod",
data: $RequestData
});
};]
}
angular.module("App").service("$ServiceName", ["$http", $Name]);]
}