/// <summary>
 /// Creates a TsCollection from TsType
 /// </summary>
 /// <param name="type"></param>
 /// <returns></returns>
 private TsCollection CreateCollectionType(TsType type)
 {
     var resolved = new TsCollection(type.Type);
     resolved.ItemsType = this.ResolveType(resolved.ItemsType, false);
     return resolved;
 }
        public void WhenInitilized_ClrTypeIsSet()
        {
            var type = typeof(string);

            var target = new TsType(type);

            Assert.Equal(type, target.Type);
        }
        /// <summary>
        /// Resolves TsType to the more specialized type.
        /// </summary>
        /// <param name="toResolve">The type to resolve.</param>
        /// <returns></returns>
        private TsType ResolveType(TsType toResolve, bool useOpenGenericDefinition = true)
        {
            if (!(toResolve is TsType)) {
                return toResolve;
            }

            if (_knownTypes.ContainsKey(toResolve.Type)) {
                return _knownTypes[toResolve.Type];
            } else if (toResolve.Type.IsGenericType && useOpenGenericDefinition) {
                // We stored its open type definition instead
                TsType openType = null;
                if (_knownTypes.TryGetValue(toResolve.Type.GetGenericTypeDefinition(), out openType)) {
                    return openType;
                }
            } else if (toResolve.Type.IsGenericType) {
                var genericType = TsType.Create(toResolve.Type);
                _knownTypes[toResolve.Type] = genericType;
                return genericType;
            }

            var typeFamily = TsType.GetTypeFamily(toResolve.Type);
            TsType type = null;

            switch (typeFamily) {
                case TsTypeFamily.System: type = new TsSystemType(toResolve.Type); break;
                case TsTypeFamily.Collection: type = this.CreateCollectionType(toResolve); break;
                case TsTypeFamily.Enum: type = new TsEnum(toResolve.Type); break;
                default: type = TsType.Any; break;
            }

            _knownTypes[toResolve.Type] = type;
            return type;
        }