@@ -770,13 +770,21 @@ export class Resolver extends DiagnosticEmitter {
770770 // apply concrete types to the generic function signature
771771 let resolvedTypeArguments = new Array < Type > ( numTypeParameters ) ;
772772 for ( let i = 0 ; i < numTypeParameters ; ++ i ) {
773- let name = typeParameterNodes [ i ] . name . text ;
773+ let typeParameterNode = typeParameterNodes [ i ] ;
774+ let name = typeParameterNode . name . text ;
774775 if ( contextualTypeArguments . has ( name ) ) {
775776 let inferredType = assert ( contextualTypeArguments . get ( name ) ) ;
776777 if ( inferredType != Type . auto ) {
777778 resolvedTypeArguments [ i ] = inferredType ;
778779 continue ;
779780 }
781+ let defaultType = typeParameterNode . defaultType ;
782+ if ( defaultType ) {
783+ let resolvedDefaultType = this . resolveType ( defaultType , ctxFlow . actualFunction , contextualTypeArguments , reportMode ) ;
784+ if ( ! resolvedDefaultType ) return null ;
785+ resolvedTypeArguments [ i ] = resolvedDefaultType ;
786+ continue ;
787+ }
780788 }
781789 // unused template, e.g. `function test<T>(): void {...}` called as `test()`
782790 // invalid because the type is effectively unknown inside the function body
@@ -2249,10 +2257,12 @@ export class Resolver extends DiagnosticEmitter {
22492257 if ( numNullLiterals == length ) { // all nulls infers as usize
22502258 elementType = this . program . options . usizeType ;
22512259 } else {
2252- this . error (
2253- DiagnosticCode . The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly ,
2254- node . range , "T"
2255- ) ;
2260+ if ( reportMode == ReportMode . REPORT ) {
2261+ this . error (
2262+ DiagnosticCode . The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly ,
2263+ node . range , "T"
2264+ ) ;
2265+ }
22562266 return null ;
22572267 }
22582268 }
@@ -2264,6 +2274,16 @@ export class Resolver extends DiagnosticEmitter {
22642274 }
22652275 return assert ( this . resolveClass ( this . program . arrayPrototype , [ elementType ] ) ) ;
22662276 }
2277+ case LiteralKind . OBJECT : {
2278+ if ( ctxType . isClass ) return ctxType . classReference ;
2279+ if ( reportMode == ReportMode . REPORT ) {
2280+ this . error (
2281+ DiagnosticCode . Expression_cannot_be_represented_by_a_type ,
2282+ node . range
2283+ ) ;
2284+ }
2285+ return null ;
2286+ }
22672287 }
22682288 assert ( false ) ;
22692289 return null ;
0 commit comments