T4 template to generate TypeScript interface definitions.
-
Install the NuGet package (https://nuget.org/packages/T4TS).
-
Decoreate any C# class that you want to generate an interface for, with the
TypeScriptInterfaceAttribute
(in the T4TS namespace). -
Run the T4TS.tt-file (right-click and select Run custom tool).
-
The generated file T4TS.d.ts will now contain the interfaces that can be used in your TypeScript files.
C# classes:
[TypeScriptInterface]
public class MyModel
{
public int Number { get; set; }
public string Name { get; set; }
public ReferencedModel Ref { get; set; }
}
[TypeScriptInterface]
public class ReferencedModel
{
public double Fraction { get; set; }
public int[] Digits { get; set; }
}
Resulting T4TS.d.ts:
module T4TS {
export interface MyModel {
Number: number;
Name: string;
Ref: ReferencedModel;
}
export interface ReferencedModel {
Fraction: number;
Digits: number[];
}
}
This interface can now be used in your TypeScript files:
/// <reference path="T4TS.d.ts" />
class Test {
constructor () {
// Make an AJAX post and get some data from the server.
// In the callback, you can specify that the data is of a certain type:
$.post('./example', {}, (data: T4TS.MyModel) => {
// Intellisense support for the properties:
alert(data.Number.toString());
alert(data.Ref.Digits[0].toString());
});
}
}
-
Only public properties are considered
-
Right now,
System.DateTime
is considered astring
in the type translation. The main reason is that the JSON serialization in .NET MVC will typically serialize aDateTime
as"\/Date(ticks)\/"
-
The type translation works like this, from C# => TypeScript, for each property:
- Built-in numeric type (
int
,double
,float
, etc.) =>number
string
=>string
Nullable<T>
=>T?
- A class marked with
[TypeScriptInterface]
=> lookup the generated TypeScript name - Otherwise =>
any
- For
Collection<T>
,List<T>
,IList<T>
andT[]
=> lookup type forT
as above, and returnT[]
.
- Built-in numeric type (
-
Inheritance of interfaces is supported. If
Bar
inheritsFoo
in C# and both are marked with theTypeScriptInterfaceAttribute
, the generated interface would beinterface Bar extends Foo {...
.
The attribute TypeScriptInterfaceAttribute
is set on C# classes, and has the following properties:
- Name: Specifies the name of the interface (default is the class name).
- Module: Specifies the module of the interface (default T4TS).
- NamePrefix: If specified, the interface name will be prefixed with this string.
The attribute TypeScriptMemberAttribute
can be set on the properties of a C# class, and has the following properties:
- Name: Specifies the name of the member (default is the property name).
- Optional: Specifies whether this member should be optional, ie.
member?: type
instead ofmember: type
. - Type: Specifies the type of the member (default is to do type translation of the property).
- CamelCase: If set to true, the first character of the member name will be lower cased.
There are a couple of default settings that can be specified in the T4TS.tt.settings.t4
file.
- DefaultModule: The default module name of an interfaces (if not specified by
TypeScriptInterfaceAttribute
). Default is"T4TS"
. - DefaultOptional: The default value for the
Optional
flag forTypeScriptMemberAttribute
. Default isfalse
. - DefaultCamelCaseMemberNames: The default value for the
CamelCase
flag forTypeScriptMemberAttribute
. Default isfalse
. - DefaultInterfaceNamePrefix: The default value for the
NamePrefix
flag forTypeScriptInterfaceAttribute
. Default is""
. - CompatibilityVersion: The version of Typescript that is targeted. This will help handling breaking changes in the language grammar and/or compiler. Default (right now) is 0.9.1.1.
TextTransformation fails:
I have experienced some error message the first time the T4TS package is installed via NuGet. However, if you build the project, or run the .tt-file, the error message disappears.
Thanks to T4MVC, which has been the inspiration. I also learned how to use the .tt-stuff from reading the source, and using part of the source code from T4MVC.