2014-09-26 15 views
5

Ich verwende Typelite 9.5.0, um meine C# -Klassen zu Typescript-Schnittstellen zu konvertieren. Ich möchte, dass ein NULL-fähiger Typ (z. B. Guid?) In Typescript in einen Nullable-Typ konvertiert wird.Typelite: Wie setze ich Nullable C# -Typen auf Nullable Typescript-Typen mit T4-Transformation?

Derzeit ich diese C# Klasse:

public class PersistentClassesReferences 
{ 
public Guid? EmailMessageId { get; set; } 
public Guid? FileMetaDataId { get; set; } 
public Guid? IssueId { get; set; } 
public Guid? ProjectId { get; set; } 
} 

Aber das ist mit Typelite dieser Typoskript Schnittstelle umgewandelt:

interface IPersistentClassesReferences { 
    EmailMessageId : System.IGuid; 
    FileMetaDataId : System.IGuid; 
    IssueId : System.IGuid; 
    ProjectId : System.IGuid; 
} 

Aber wenn ich möchte eine neue Typoskript Variable von dieser Schnittstelle erstellen, Der Compiler beschwert sich, wenn ich nicht alle Eigenschaften eingestellt habe (null eines Wertes).

Daher hatte ich eine Vorlage, die für NULL-Typ testen, und wenn ja, fügt ein?

var isNullabe = Nullable.GetUnderlyingType(tsprop.ClrProperty.PropertyType) != null; 
if (isNullabe) 
{ 
    return identifier.Name + "? "; 
} 

Das hat funktioniert, aber nicht mehr (ich glaube, nach dem Upgrade 9.5.0 oder eine andere nugetpackage Update Typelite).

erhalte ich die Fehlermeldung:

Compiling transformation: 'System.Reflection.MemberInfo' does not contain a 
definition for 'PropertyType' and no extension method 'PropertyType' accepting 
a first argument of type 'System.Reflection.MemberInfo' could be found (are you 
missing a using directive or an assembly reference?)   

Wie kann ich ein Fragezeichen auf den identifiername hinzufügen?

Antwort

3

Wenn Sie einen TypeLite Formatierer sollte dies nutzen wollen arbeiten:

var propertyInfo = tsprop.ClrProperty as PropertyInfo; 
var propertyType = propertyInfo != null ? propertyInfo.PropertyType : ((FieldInfo)tsprop.ClrProperty).FieldType;  
var isNullabe = Nullable.GetUnderlyingType(propertyType) != null; 
if (isNullabe) { 
    return identifier.Name + "? "; 
} 
+0

Das funktioniert gut! Vielen Dank. – RHAD

0

Die gute Nachricht ist, dass Sie dies nicht tun müssen, da der Modifizierer ? in TypeScript das gesamte Element für den Zweck des Strukturtypenvergleichs optional macht. Wie Sie nur die Typen nullable machen wollen, müssen Sie etwas tun, wie Sie jede Art in Typoskript bereits null kann:

var a: number = null; 
var b: boolean = null; 
var c: string = null; 
var d: string[] = null; 
//... and so on 

Hier eine Demo, wie die ? Werke in Typoskript ist (es nicht zu tun ist, mit nullability):

interface Example { 
    a?: string; 
    b: string; 
} 

var both = { a: '', b: '' }; 
var onlyB = { b: '' }; 
var onlyA = { a: '' }; 

function doExample(x: Example) { 
    return x; 
} 

// Fine 
doExample(both); 

// Fine 
doExample(onlyB); 

// Not fine - compiler warning 
doExample(onlyA); 

Wenn der Compiler die Argumente doExample weitergegeben prüft, wird er die a Eigenschaft erlauben weggelassen werden, da sie die ? hat. Die b Eigenschaft muss angegeben werden.

+0

Das stimmt zwar, was Sie sagen, aber ich habe eine C# -Klasse, die (Typelite T4) in Typoskript umgewandelt werden muss. In meinem Fall C# -Typen, die in der Schnittstelle, auf die sie konvertiert wird, NULL-fähig oder nicht NULL-fähig sind (aber natürlich NULL-Werte haben dürfen). Ich habe meinen Beitrag aktualisiert, um meine Frage besser zu reflektieren. – RHAD

9

Sie können es mit dem Attribut TsProperty erstellen, zum Beispiel die folgenden C# -Code wird in einem optionalen Eigenschaft zur Folge haben:

[TsClass] 
public class Person 
{ 
    [TsProperty(IsOptional=true)] 
    public string Name { get; set; } 
    public List<Address> Addresses { get; set; } 
} 

Dies generiert die folgende Typoskript Definition

interface Person { 
    Name?: string; 
    Addresses: TypeScriptHTMLApp1.Address[]; 
} 

können Sie finden mehr dazu hier: docs

Sehen Sie den Code, wo es es tut: code

2

Als Antwort auf Lukas' Antwort:

Wer dies liest und eine neuere Version von TypeLite verwendet werden feststellen, dass TsProperty nicht mehr hat eine Eigenschaft namens ClrProperty.Es heißt jetzt MemberInfo (und hat den Typ MemberInfo).

Hier ist ein Beispiel für eine MemberFormatter, die Nullable C# -Typen in optionale TypeScript-Eigenschaften verwandelt. Es macht auch Mitglieder camel case namens: