Reinforced.Typings is available on NuGet.
PM> Install-Package Reinforced.Typings
Find out detailed information in Reinforced.Typings wiki
Version 1.3.0 releaed!
Migration tips:
- Some of parameters are moved from Reinforced.Typings.settings.xml to [TsGlobal] attribute and .Global fluent call. Please check out corresponding documentation pages to find out what has been changed
RtTypeName
and other types ASTs has been moved toReinforced.Typings.Ast.TypeNames
namespace. Be aware of updating your usings
Features:
- Modules support
- Inline implementations
- Substitutions
- TS tuples
- Types and members reordering
- Global parameters
- Improved generics support
- Bugfixes
- Updated documentation
- Updated generators sample. Now documentation regarding using code generators is located in the corresponding example ( samples .zip download ). Please refer to it to find out how to use code generators
This framework converts your .NET assemblies to TypeScript code. It integrates to VisualStudio build process and simply does its job according to configuration. Please check out documentation to discover numbers of useful features (type substitutions, modules, code generators, fluent configuration, multi-file export, JSDOC).
In a nutshell, you can use Reinforced.Typings for:
C# | TypeScript | |
namespace MyApp
{
using Reinforced.Typings.Attributes;
[TsInterface]
public class Order
{
public string ItemName { get; set; }
public int Quantity { get; set; }
public double Subtotal { get; set; }
public bool IsPaid { get; set; }
public string ClientName { get; set; }
public string Address { get; set; }
}
[TsClass]
public class User
{
public string FirstName { get; set; }
public string Email { get; set; }
public UserType Type { get; set; }
}
[TsEnum]
public enum UserType { One, Two }
} |
module MyApp {
export interface IOrder
{
ItemName: string;
Quantity: number;
Subtotal: number;
IsPaid: boolean;
ClientName: string;
Address: string;
}
export class User
{
public FirstName: string;
public Email: string;
public Type: MyApp.UserType;
}
export enum UserType {
One = 0,
Two = 1,
}
}
|
C# | TypeScript | |
namespace MyApp
{
using Reinforced.Typings.Attributes;
[TsInterface]
public class Page
{
public List<Order> Orders { get; set; }
public Dictionary<int, Order>
Cache { get; set; }
public string[] Tags { get; set; }
public IEnumerable<object>
Things { get; set; }
}
} |
module MyApp {
export interface IPage
{
Orders: MyApp.IOrder[];
Cache: { [key:number]: MyApp.IOrder };
Tags: string[];
Things: any[];
}
}
|
Now you will not stay powerless when generated typings fail your TypeScript build in project. See RtBypassTypeScriptCompilation configuration parameter.
C# | TypeScript | |
namespace MyApp
{
using Reinforced.Typings.Attributes;
public interface INonExport
{
string Boom { get; }
}
[TsInterface]
public class WithoutInterface
: INonExport
{
public string Boom { get; set; }
}
[TsInterface]
public interface IEntity
{
int Id { get; set; }
}
[TsInterface]
public class User : IEntity
{
public int Id { get; set; }
public string Login { get; set; }
}
} |
module MyApp {
export interface IWithoutInterface
{
Boom: string;
}
export interface IEntity
{
Id: number;
}
export interface IUser extends MyApp.IEntity
{
Id: number;
Login: string;
}
}
|
Details can be found on the corresponding wiki page
C# | TypeScript | |
namespace MyApp
{
using Reinforced.Typings.Fluent;
using System.Web.Mvc;
public class Configuration
{
public static void
Configure(ConfigurationBuilder builder)
{
builder
.ExportAsInterface<SelectListItem>()
.OverrideNamespace("MyApp")
.WithPublicProperties();
}
}
} |
module MyApp {
export interface ISelectListItem
{
Disabled: boolean;
Group: any;
Selected: boolean;
Text: string;
Value: string;
}
}
|
|
Reinforced.Typings.settings.xml: <RtConfigurationMethod>MyApp.Configuration.Configure</RtConfigurationMethod> |
Read more here.
C# | TypeScript | |
namespace MyApp
{
using Reinforced.Typings.Fluent;
using System.Web.Mvc;
[TsClass(CodeGeneratorType = typeof(AngularControllerGenerator)]
public class AngularController : Controller
{
[AngularMethod(typeof(SampleResponseModel))]
public ActionResult Save(Order order)
{
return Json(new {
Message = "Success",
Success = true
});
}
}
public class AngularMethodAttribute
: TsFunctionAttribute
{
public AngularMethodAttribute(Type returnType)
{
StrongType = returnType;
CodeGeneratorType = typeof
(AngularActionCallGenerator);
}
}
public class AngularActionCallGenerator
: MethodCodeGenerator
{
// too long - see sample
}
public class AngularControllerGenerator
: ClassCodeGenerator
{
// too long - see sample
}
[TsInterface]
public class SampleResponseModel
{
public string Message { get; set; }
public bool Success { get; set; }
}
} |
module MyApp {
export interface ISampleResponseModel
{
Message: string;
Success: boolean;
}
if (window['app']) {
window['app'].factory('Api.AngularController',
['$http',
($http: angular.IHttpService) => new AngularController($http)]);
}
/** Result of AngularControllerGenerator activity */
export class AngularController
{
constructor ($http: angular.IHttpService)
{
this.http = $http;
}
public Save(order: IOrder) : angular.IPromise<ISampleResponseModel>
{
var params = { 'order': order };
return this.http.post('/Angular/Save', params)
.then((response) => { return response.data; });
}
}
} |