I am no longer working on this project. Since it's been a long while since I was active on the .NET platform, I am unable to keep up with new versions of .NET to maintain the project. Thanks to all that have been contributing, it's been fun!
-
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.DateTimeis considered astringin the type translation. The main reason is that the JSON serialization in .NET MVC will typically serialize aDateTimeas"\/Date(ticks)\/" -
The type translation works like this, from C# => TypeScript, for each property:
- Built-in numeric type (
int,double,float, etc.) =>number string=>stringNullable<T>=>T?- A class marked with
[TypeScriptInterface]=> lookup the generated TypeScript name - Otherwise =>
any - For
IEnumerable<T>,Collection<T>,List<T>,IList<T>andT[]=> lookup type forTas above, and returnT[].
- Built-in numeric type (
-
Inheritance of interfaces is supported. If
BarinheritsFooin 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?: typeinstead 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.
- Ignore: If set to true, the property will be ignored.
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
Optionalflag forTypeScriptMemberAttribute. Default isfalse. - DefaultCamelCaseMemberNames: The default value for the
CamelCaseflag forTypeScriptMemberAttribute. Default isfalse. - DefaultInterfaceNamePrefix: The default value for the
NamePrefixflag 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.
See README.md in T4TS.Build and T4TS.Build.Builder for details.
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.