refleksjon - Typelite: hvordan sette nullable C#-typer til nullable Typescript-typer med T4-transformasjon?
Jeg bruker Typelite 9.5.0 for å konvertere C#-klassene mine til Typescript-grensesnitt. Jeg ønsker at en nullable type i (f.eks. Guid?) skal konverteres til en nullable type i Typescript.
For øyeblikket har jeg denne C#-klassen:
public class PersistentClassesReferences
{
public Guid? EmailMessageId { get; set; }
public Guid? FileMetaDataId { get; set; }
public Guid? IssueId { get; set; }
public Guid? ProjectId { get; set; }
}
Men det konverteres med Typelite til dette Typescript-grensesnittet:
interface IPersistentClassesReferences {
EmailMessageId : System.IGuid;
FileMetaDataId : System.IGuid;
IssueId : System.IGuid;
ProjectId : System.IGuid;
}
Men når jeg vil opprette en ny TypeScript-variabel fra dette grensesnittet, klager kompilatoren når jeg ikke har satt alle egenskapene (null eller en eller annen verdi).
Derfor hadde jeg en mal på plass som tester for nullable type, og hvis det er tilfelle, legger til et ?
var isNullabe = Nullable.GetUnderlyingType(tsprop.ClrProperty.PropertyType) != null;
if (isNullabe)
{
return identifier.Name + "? ";
}
Dette fungerte, men ikke lenger (jeg tror etter oppgraderingen til Typelite 9.5.0 eller en annen NuGet-pakkeoppdatering).
Jeg får feilmeldingen:
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?)
Hvordan kan jeg legge til et spørsmålstegn i identifikatornavnet?
Svar #1
Du kan opprette det med TsProperty-attributtet, for eksempel vil følgende C#-kode resultere i en valgfri egenskap:
[TsClass]
public class Person
{
[TsProperty(IsOptional=true)]
public string Name { get; set; }
public List<Address> Addresses { get; set; }
}
Dette vil generere følgende TypeScript-definisjon
interface Person {
Name?: string;
Addresses: TypeScriptHTMLApp1.Address[];
}
Du kan finne mer om dette her: docs
Se koden hvor det gjør det her: kode
Svar #2
Hvis du vil bruke en TypeLite-formaterer, bør dette fungere:
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 + "? ";
}
