@@ -770,13 +770,21 @@ export class Resolver extends DiagnosticEmitter {
770
770
// apply concrete types to the generic function signature
771
771
let resolvedTypeArguments = new Array < Type > ( numTypeParameters ) ;
772
772
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 ;
774
775
if ( contextualTypeArguments . has ( name ) ) {
775
776
let inferredType = assert ( contextualTypeArguments . get ( name ) ) ;
776
777
if ( inferredType != Type . auto ) {
777
778
resolvedTypeArguments [ i ] = inferredType ;
778
779
continue ;
779
780
}
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
+ }
780
788
}
781
789
// unused template, e.g. `function test<T>(): void {...}` called as `test()`
782
790
// invalid because the type is effectively unknown inside the function body
@@ -2249,10 +2257,12 @@ export class Resolver extends DiagnosticEmitter {
2249
2257
if ( numNullLiterals == length ) { // all nulls infers as usize
2250
2258
elementType = this . program . options . usizeType ;
2251
2259
} 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
+ }
2256
2266
return null ;
2257
2267
}
2258
2268
}
@@ -2264,6 +2274,16 @@ export class Resolver extends DiagnosticEmitter {
2264
2274
}
2265
2275
return assert ( this . resolveClass ( this . program . arrayPrototype , [ elementType ] ) ) ;
2266
2276
}
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
+ }
2267
2287
}
2268
2288
assert ( false ) ;
2269
2289
return null ;
0 commit comments