Beispiel #1
0
 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;
 }
Beispiel #2
0
        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"));
        }
Beispiel #3
0
        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));
        }