2014-10-07 14 views
9

Kann Typelite anstelle einer Schnittstelle eine TypeScript-Klasse generieren? Etwas wie:Typelite POCO Class Generation

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

zu

export class Person 
{ 
    constructor() {} 
    FirstName: string; 
    LastName: string; 
} 

Ich bin nicht für jede Funktionalität in den generierten Klassen suchen, nur einen einfacheren Weg, der Lage sein, Klassen zu instanziiert Clientside, ohne die gesamte Schnittstelle initialisieren zu müssen.

Zum Beispiel würde ich es vorziehen, das in der Lage zu tun:

var person = new Person(); 

Statt

var person = { 
    FirstName: null, 
    LastName: null 
}; 

Antwort

7

Was ich tat, war eine einfache Anpassung an die tt-Datei vornehmen, erspart Ihnen Ihre eigenen typelite kompilieren:

<#= definitions.ToString() 
.Replace("interface", "export class") 
.Replace("declare module", "module") #> 
+0

Danke. Das ist hilfreich. Es bedeutet, dass ich 2 Dateien generieren muss, da ich nur daran interessiert bin, dass dies in bestimmten Klassen geschieht. – bingles

+1

Wo mache ich diese Änderung? Können Sie Ihre TypeLite.Net4.tt-Klasse freigeben? –

4

Leider ist dieses Szenario nicht gerade unterstützt.

Ich habe nie eine solche Funktion verpasst, weil Klassen in der Regel einige Methoden haben, so dass es für mich keinen Sinn ergab. Sie können aber auch mit der Quelle ('TsGenerator.cs') spielen, es sollte nicht zu schwierig sein, Klassen anstelle von Schnittstellen zu generieren, wenn Sie keine Methoden in den Klassen benötigen.

+0

Dank. Für mich ist es sinnvoll, eine Klasse zu generieren, in der alle Eigenschaften private Setter haben und vom Konstruktor initialisiert werden. Auf diese Weise wird es einfacher sein, Fehler auf der Clientseite zu initialisieren. Aber nicht sicher, ob es jemals möglich ist. – Artiom

+0

Es ist sicherlich möglich, aber die Klassen können kein Verhalten haben (wie Methoden), da jedes Mal, wenn Sie TypeLite ausführen, Ihr benutzerdefinierter Code verloren geht. Wenn TypeScript Unterstützung für so etwas wie partielle Klassen bietet, werde ich Unterstützung für das Generieren von Klassen hinzufügen, aber mir ist dieses Konzept nicht bekannt. –

+0

Für mich gibt es keine Notwendigkeit in Methoden, da es meiner Meinung nach eine schlechte Übung wäre, Verhalten zu DTOs hinzuzufügen. Nur eine Klasse mit ctor – Artiom

1

Diese Funktion wird von Reinforced.Typings unterstützt wird.

Attribut

[TsClass] 
public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

oder fluent call

public class Configuration 
{ 
    public static void Configure(ConfigurationBuilder builder) 
    { 
      builder 
       .ExportAsClass<Person>() 
       .WithPublicProperties(); 
    } 
} 

wird nach in die Ausgabedatei erzeugen:

namespace MyApp { 
    export class User 
    { 
     public FirstName: string; 
     public LastName : string; 
    } 
} 
0

Erweiterung auf @Flores' Antwort oben, in der neuesten Version von TypeLite (1.8.4 ab sofort), können Sie den Aufruf von ts.Generate (...) wie folgt ändern ows:

<#= ts.Generate(TsGeneratorOutput.Properties) 
    .Replace("interface", "export class") 
    .Replace("declare module", "module") #> 

Volltrans:

<#@ template debug="false" hostspecific="True" language="C#" #> 
<#@ assembly name="$(TargetDir)TypeLite.dll" #> 
<#@ assembly name="$(TargetDir)TypeLite.Net4.dll" #> 
<#@ assembly name="$(TargetDir)MyAssembly.dll" #> 

<#@ import namespace="TypeLite" #> 
<#@ import namespace="TypeLite.Net4" #> 
<#@output extension=".d.ts"#> 

<#@include file="Manager.ttinclude"#> 
<# var manager = Manager.Create(Host, GenerationEnvironment); #> 

<# var ts = TypeScript.Definitions() 
    .WithReference("Enums.ts") 
    .ForLoadedAssemblies(); 
#> 

<#= ts.Generate(TsGeneratorOutput.Properties) 
    .Replace("interface", "export class") 
    .Replace("declare module", "module") #> 

<# manager.StartNewFile("Enums.ts"); #> 
<#= ts.Generate(TsGeneratorOutput.Enums) #> 
<# manager.EndBlock(); #> 
<# manager.Process(true); #>