@@ -349,14 +349,15 @@ namespace ts {
349349 decorators : ReadonlyArray < Decorator > | undefined ,
350350 modifiers : ReadonlyArray < Modifier > | undefined ,
351351 name : string | PropertyName ,
352- questionToken : QuestionToken | undefined ,
352+ questionOrExclamationToken : QuestionToken | ExclamationToken | undefined ,
353353 type : TypeNode | undefined ,
354354 initializer : Expression | undefined ) {
355355 const node = < PropertyDeclaration > createSynthesizedNode ( SyntaxKind . PropertyDeclaration ) ;
356356 node . decorators = asNodeArray ( decorators ) ;
357357 node . modifiers = asNodeArray ( modifiers ) ;
358358 node . name = asName ( name ) ;
359- node . questionToken = questionToken ;
359+ node . questionToken = questionOrExclamationToken !== undefined && questionOrExclamationToken . kind === SyntaxKind . QuestionToken ? questionOrExclamationToken : undefined ;
360+ node . exclamationToken = questionOrExclamationToken !== undefined && questionOrExclamationToken . kind === SyntaxKind . ExclamationToken ? questionOrExclamationToken : undefined ;
360361 node . type = type ;
361362 node . initializer = initializer ;
362363 return node ;
@@ -367,16 +368,17 @@ namespace ts {
367368 decorators : ReadonlyArray < Decorator > | undefined ,
368369 modifiers : ReadonlyArray < Modifier > | undefined ,
369370 name : string | PropertyName ,
370- questionToken : QuestionToken | undefined ,
371+ questionOrExclamationToken : QuestionToken | ExclamationToken | undefined ,
371372 type : TypeNode | undefined ,
372373 initializer : Expression | undefined ) {
373374 return node . decorators !== decorators
374375 || node . modifiers !== modifiers
375376 || node . name !== name
376- || node . questionToken !== questionToken
377+ || node . questionToken !== ( questionOrExclamationToken !== undefined && questionOrExclamationToken . kind === SyntaxKind . QuestionToken ? questionOrExclamationToken : undefined )
378+ || node . exclamationToken !== ( questionOrExclamationToken !== undefined && questionOrExclamationToken . kind === SyntaxKind . ExclamationToken ? questionOrExclamationToken : undefined )
377379 || node . type !== type
378380 || node . initializer !== initializer
379- ? updateNode ( createProperty ( decorators , modifiers , name , questionToken , type , initializer ) , node )
381+ ? updateNode ( createProperty ( decorators , modifiers , name , questionOrExclamationToken , type , initializer ) , node )
380382 : node ;
381383 }
382384
@@ -729,6 +731,36 @@ namespace ts {
729731 : node ;
730732 }
731733
734+ export function createConditionalTypeNode ( checkType : TypeNode , extendsType : TypeNode , trueType : TypeNode , falseType : TypeNode ) {
735+ const node = createSynthesizedNode ( SyntaxKind . ConditionalType ) as ConditionalTypeNode ;
736+ node . checkType = parenthesizeConditionalTypeMember ( checkType ) ;
737+ node . extendsType = parenthesizeConditionalTypeMember ( extendsType ) ;
738+ node . trueType = trueType ;
739+ node . falseType = falseType ;
740+ return node ;
741+ }
742+
743+ export function updateConditionalTypeNode ( node : ConditionalTypeNode , checkType : TypeNode , extendsType : TypeNode , trueType : TypeNode , falseType : TypeNode ) {
744+ return node . checkType !== checkType
745+ || node . extendsType !== extendsType
746+ || node . trueType !== trueType
747+ || node . falseType !== falseType
748+ ? updateNode ( createConditionalTypeNode ( checkType , extendsType , trueType , falseType ) , node )
749+ : node ;
750+ }
751+
752+ export function createInferTypeNode ( typeParameter : TypeParameterDeclaration ) {
753+ const node = < InferTypeNode > createSynthesizedNode ( SyntaxKind . InferType ) ;
754+ node . typeParameter = typeParameter ;
755+ return node ;
756+ }
757+
758+ export function updateInferTypeNode ( node : InferTypeNode , typeParameter : TypeParameterDeclaration ) {
759+ return node . typeParameter !== typeParameter
760+ ? updateNode ( createInferTypeNode ( typeParameter ) , node )
761+ : node ;
762+ }
763+
732764 export function createParenthesizedType ( type : TypeNode ) {
733765 const node = < ParenthesizedTypeNode > createSynthesizedNode ( SyntaxKind . ParenthesizedType ) ;
734766 node . type = type ;
@@ -4092,6 +4124,10 @@ namespace ts {
40924124 return expression ;
40934125 }
40944126
4127+ export function parenthesizeConditionalTypeMember ( member : TypeNode ) {
4128+ return member . kind === SyntaxKind . ConditionalType ? createParenthesizedType ( member ) : member ;
4129+ }
4130+
40954131 export function parenthesizeElementTypeMember ( member : TypeNode ) {
40964132 switch ( member . kind ) {
40974133 case SyntaxKind . UnionType :
@@ -4100,7 +4136,7 @@ namespace ts {
41004136 case SyntaxKind . ConstructorType :
41014137 return createParenthesizedType ( member ) ;
41024138 }
4103- return member ;
4139+ return parenthesizeConditionalTypeMember ( member ) ;
41044140 }
41054141
41064142 export function parenthesizeArrayTypeMember ( member : TypeNode ) {
@@ -4293,15 +4329,15 @@ namespace ts {
42934329 return emitNode && emitNode . externalHelpersModuleName ;
42944330 }
42954331
4296- export function getOrCreateExternalHelpersModuleNameIfNeeded ( node : SourceFile , compilerOptions : CompilerOptions , hasExportStarsToExportValues ?: boolean ) {
4332+ export function getOrCreateExternalHelpersModuleNameIfNeeded ( node : SourceFile , compilerOptions : CompilerOptions , hasExportStarsToExportValues ?: boolean , hasImportStarOrImportDefault ?: boolean ) {
42974333 if ( compilerOptions . importHelpers && isEffectiveExternalModule ( node , compilerOptions ) ) {
42984334 const externalHelpersModuleName = getExternalHelpersModuleName ( node ) ;
42994335 if ( externalHelpersModuleName ) {
43004336 return externalHelpersModuleName ;
43014337 }
43024338
43034339 const moduleKind = getEmitModuleKind ( compilerOptions ) ;
4304- let create = hasExportStarsToExportValues
4340+ let create = ( hasExportStarsToExportValues || ( compilerOptions . esModuleInterop && hasImportStarOrImportDefault ) )
43054341 && moduleKind !== ModuleKind . System
43064342 && moduleKind !== ModuleKind . ES2015
43074343 && moduleKind !== ModuleKind . ESNext ;
0 commit comments