Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/reinforced/Reinforced.Typings

Converts C# classes to TypeScript interfaces (and many more) within project build. 0-dependency, minimal, gluten-free
https://github.com/reinforced/Reinforced.Typings

asp-net asp-net-mvc ast code-generator csharp msbuild mvc5 typescript

Last synced: 4 days ago
JSON representation

Converts C# classes to TypeScript interfaces (and many more) within project build. 0-dependency, minimal, gluten-free

Awesome Lists containing this project

README

        

What is that?
=================
You develop frontend applications with TypeScript and .NET Backend? You need Reinforced.Typings.

It converts .NET classes into TypeScript code. Suffering has ended - you don't need to write and maintain boring TypeScript glue code for your DTOs/ViewModels/APIs anymore - RT can generate it from C# app.
Moreover, it integrates with MSBuild build process and (re)generates glue code every time you rebuild .NET backend. So you get immediately notified when backend's API/DTOs changed and frontend is broken.

Check out [documentation](https://github.com/reinforced/Reinforced.Typings/wiki) to discover numbers of useful features (type substitutions, modules, code generators, fluent configuration, multi-file export, JSDOC).

Reinforced.Typings is available on [NuGet](https://www.nuget.org/packages/Reinforced.Typings/).
=================
```sh
PM> Install-Package Reinforced.Typings
```

**Find out detailed information in Reinforced.Typings [wiki](https://github.com/reinforced/Reinforced.Typings/wiki)**

News
=================
> Version **1.6.3** released

- Support of .NET 8

Support policy
=================

Please **do not** ask your questions in github issues anymore. Such format is not suitable for storing FAQ. If you have question - please go to StackOverflow and ask it there. Tag your question with [reinforced-typings](https://stackoverflow.com/questions/tagged/reinforced-typings) tag. I watch full list of questions and will answer ASAP. Make experience that you've got available for other users!

**UPD**: You can notify me about question by sending link via Twitter ([@reinforced_sc](https://twitter.com/reinforced_sc)) to get answer faster.

GitHub issues are for confirmed bugs/feature requests now. If you've found bug - please write and PR test if you can. If you have feature idea - please describe it from fluent/attribute configuration point of view. Describe how'd you gonna to configure RT for desired result. Thanks in advance!

Best to be used for
=================

Exporting ViewModels
-----------------

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,
}
}

...even complex ViewModels
-------------

C#TypeScript



namespace MyApp
{
using Reinforced.Typings.Attributes;

[TsInterface]
public class Page
{
public List Orders { get; set; }

public Dictionary
Cache { get; set; }

public string[] Tags { get; set; }

public IEnumerable
Things { get; set; }
}
}




module MyApp {
export interface IPage
{
Orders: MyApp.IOrder[];
Cache: { [key:number]: MyApp.IOrder };
Tags: string[];
Things: any[];
}
}

Temporary disabling TypeScript compilation in your project
-------------
Now you will not stay powerless when generated typings fail your TypeScript build in project. See [RtBypassTypeScriptCompilation](https://github.com/reinforced/Reinforced.Typings/wiki/Reinforced.Typings.settings.xml#RtBypassTypeScriptCompilation) configuration parameter.

Inheritance preservation
-------------

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;
}
}

Use fluent configuration
-------------
Details can be found [on the corresponding wiki page](https://github.com/reinforced/Reinforced.Typings/wiki/Fluent-configuration)

C#TypeScript



namespace MyApp
{
using Reinforced.Typings.Fluent;
using System.Web.Mvc;

public class Configuration
{
public static void
Configure(ConfigurationBuilder builder)
{
builder
.ExportAsInterface()
.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>

Generate any custom glue code
-------------
Read more [here](https://github.com/reinforced/Reinforced.Typings/wiki#writing-custom-code-generators).

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; });
}
}
}