public InterfaceType( Type type, IEnumerable <TsInterfaceMember> members, IEnumerable <TsTypeReference> extends, IEnumerable <string> typeParameters, DerivedTypesUnionGeneration derivedTypesUnionGeneration, TsTypeDefinition parentToAugument, string typeMemberName ) : base(TypeUtils.GetNameWithoutGenericArity(type)) { _members = ImmutableArray.CreateRange(members); _extends = ImmutableArray.CreateRange(extends); _typeParameters = ImmutableArray.CreateRange(typeParameters); _type = type; _derivedTypesUnionGeneration = derivedTypesUnionGeneration; _parentToAugument = parentToAugument; _typeMemberName = typeMemberName; }
private static string GetDerivedTypesUnionName(Type type) { var attr = TypeUtils.GetCustomAttributesData(type).FirstOrDefault(a => a.AttributeType.Name == Constants.GenerateTypeScriptDerivedTypesUnionAttributeName); if (attr == null) { return(null); } return(attr.ConstructorArguments.Count > 0 && attr.ConstructorArguments[0].Value is string unionName ? unionName : (TypeUtils.GetNameWithoutGenericArity(type) + "Types")); }
private static TsTypeReference BuildTsTypeReference(Type type, TypeBuilderConfig config, string currentTsNamespace, bool returnTheMainTypeEvenIfItHasADerivedTypesUnion) { var isOptional = false; var underlyingNullableType = GetUnderlyingNullableType(type); if (underlyingNullableType != null) { type = underlyingNullableType; isOptional = true; } if (type.IsGenericParameter) { return(TsTypeReference.Simple(type.Name, isOptional)); } var typeFullName = TypeUtils.GetFullNameWithGenericArguments(type); if (typeFullName != null && config.TypeMappings.TryGetValue(typeFullName, out var mappedType)) { return(TsTypeReference.Wrap(mappedType, isOptional)); } var typeScriptTypeAttribute = GetTypeScriptTypeAttribute(type); if (typeScriptTypeAttribute != null) { if (typeScriptTypeAttribute.ConstructorArguments[0].Value is string typeString) { return(TsTypeReference.Simple(typeString)); } else if (typeScriptTypeAttribute.ConstructorArguments[0].Value is Type replaceWithType) { type = replaceWithType; } } if ( TypeUtils.Is <byte>(type) || TypeUtils.Is <sbyte>(type) || TypeUtils.Is <int>(type) || TypeUtils.Is <uint>(type) || TypeUtils.Is <long>(type) || TypeUtils.Is <ulong>(type) || TypeUtils.Is <short>(type) || TypeUtils.Is <ushort>(type) || TypeUtils.Is <double>(type) || TypeUtils.Is <decimal>(type) || TypeUtils.Is <float>(type) ) { return(TsTypeReference.Simple("number", isOptional)); } if (TypeUtils.Is <string>(type)) { return(TsTypeReference.Simple("string", isOptional)); } if (TypeUtils.Is <bool>(type)) { return(TsTypeReference.Simple("boolean", isOptional)); } var dictionaryTypes = GetDictionaryUnderlyingTypes(type); if (dictionaryTypes != null) { return(TsTypeReference.Dictionary(BuildTsTypeReference(dictionaryTypes.Item1, config, currentTsNamespace, false), BuildTsTypeReference(dictionaryTypes.Item2, config, currentTsNamespace, false))); } var enumerableUnderlyingType = GetEnumerableUnderlyingType(type); if (enumerableUnderlyingType != null) { return(TsTypeReference.Array(BuildTsTypeReference(enumerableUnderlyingType, config, currentTsNamespace, false))); } if (typeFullName != null && (type.IsClass || type.IsInterface || type.IsValueType)) { var namespaceName = GetTypescriptNamespace(type); if (!string.IsNullOrEmpty(namespaceName)) { var derivedTypesUnionName = returnTheMainTypeEvenIfItHasADerivedTypesUnion ? null : GetDerivedTypesUnionName(type); var typeName = TypeUtils.GetNameWithoutGenericArity(type); var prefix = ""; var suffix = ""; if (type.IsEnum && config.WrapConstEnumsInTemplateStrings) { prefix = "`${"; suffix = "}`"; } var result = default(TsTypeReference); if (namespaceName == currentTsNamespace) { result = TsTypeReference.Simple(prefix + (derivedTypesUnionName ?? typeName) + suffix, isOptional); } else { result = TsTypeReference.Simple(prefix + namespaceName + "." + (derivedTypesUnionName ?? typeName) + suffix, isOptional); } if (result != null) { if (type.GenericTypeArguments.Length > 0) { var typeArgs = type.GenericTypeArguments.Select(t => BuildTsTypeReference(t, config, currentTsNamespace, false)); result = TsTypeReference.Generic(result, typeArgs); } return(result); } } } return(TsTypeReference.Simple("unknown", isOptional)); }