I have a class,
public class Instance : IResource
{
public Dictionary<string, object> Value { get; set; }
and it is mapped to
interface Instance {
Value: System.Collections.Generic.KeyValuePair[];
interface KeyValuePair {
Key: any;
Value: any;
}
I would have expected
interface Instance {
Value: any;
or
interface Instance {
Value: {[index:string]:any};
How can I change the generation?
Also, how can I skip the name space in the generation?
A quick and dirty workaround is to use a regex to alter output:
Using
<#= Regex.Replace( ts.Generate(TsGeneratorOutput.Properties)
, @":\s*System\.Collections\.Generic\.KeyValuePair\<(?<k>[^\,]+),(?<v>[^\,]+)\>\[\];"
, m=>": {[key: "+m.Groups["k"].Value+"]: "+m.Groups["v"].Value+"};"
, RegexOptions.Multiline)
#>
Transforms a field
myField: System.Collections.Generic.KeyValuePair<string,OtherClass>[];
to
myField: {[key: string]: OtherClass};
Collection types (any type implementing IEnumerable
) is converted to arrays. Dictionary<>
implements IEnumerable<KeyValuePair<>>
and thus is converted to an array. The item-type is then expanded to its fully qualified name (FQN): System.Collections.Generic.KeyValuePair
.
Using Type Converters will let you change the type-name, but not the FQN. So it is only applicable to local types. In the case of dictionaries, you can't change the item type by inheritance.
You could either create a new dictionary type, without inheriting from Dictionary<>
. Another way around this problem, is to also use Type Formatters:
ts.WithConvertor<Dictionary<string,object>>(t => {
// Embed the real type in $
// "System.Collections.Generic.${ [key: string]: any }$[]"
return "${ [key: string]: any }$";
});
ts.WithFormatter((string memberTypeName, bool isMemberCollection) => {
// Extract the content inside $
string[] pieces = memberTypeName.Split('$');
if (pieces.Length == 3) return pieces[1];
// Default behaviour
return memberTypeName + (isMemberCollection ? "[]" : "");
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With