diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5af10d2b76808..1a34d1674238d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27534,7 +27534,7 @@ namespace ts { const inferenceContext = getInferenceContext(node); // If no inferences have been made, nothing is gained from instantiating as type parameters // would just be replaced with their defaults similar to the apparent type. - if (inferenceContext && contextFlags! & ContextFlags.Signature && some(inferenceContext.inferences, hasInferenceCandidates)) { + if (inferenceContext && contextFlags! & ContextFlags.Signature && (contextualType.flags & TypeFlags.Conditional || some(inferenceContext.inferences, hasInferenceCandidates))) { // For contextual signatures we incorporate all inferences made so far, e.g. from return // types as well as arguments to the left in a function call. return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper); diff --git a/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.js b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.js new file mode 100644 index 0000000000000..de0c0d47f592e --- /dev/null +++ b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.js @@ -0,0 +1,32 @@ +//// [contextualSignatureConditionalTypeInstantiationUsingDefault.ts] +export interface TypegenDisabled { + "@@xstate/typegen": false; +} +export interface TypegenEnabled { + "@@xstate/typegen": true; +} + +type ActionFunction = (event: TEvent) => void; + +declare function createMachine< + TTypesMeta extends TypegenEnabled | TypegenDisabled = TypegenDisabled +>( + config: { + types?: TTypesMeta; + }, + implementations: TTypesMeta extends TypegenEnabled + ? ActionFunction<{ type: "test" }> + : ActionFunction<{ type: string }> +): void; + +createMachine({}, (ev) => { + ev.type; // should be `string` +}); + + +//// [contextualSignatureConditionalTypeInstantiationUsingDefault.js] +"use strict"; +exports.__esModule = true; +createMachine({}, function (ev) { + ev.type; // should be `string` +}); diff --git a/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.symbols b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.symbols new file mode 100644 index 0000000000000..5cc100655002e --- /dev/null +++ b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.symbols @@ -0,0 +1,65 @@ +=== tests/cases/compiler/contextualSignatureConditionalTypeInstantiationUsingDefault.ts === +export interface TypegenDisabled { +>TypegenDisabled : Symbol(TypegenDisabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 0, 0)) + + "@@xstate/typegen": false; +>"@@xstate/typegen" : Symbol(TypegenDisabled["@@xstate/typegen"], Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 0, 34)) +} +export interface TypegenEnabled { +>TypegenEnabled : Symbol(TypegenEnabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 2, 1)) + + "@@xstate/typegen": true; +>"@@xstate/typegen" : Symbol(TypegenEnabled["@@xstate/typegen"], Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 3, 33)) +} + +type ActionFunction = (event: TEvent) => void; +>ActionFunction : Symbol(ActionFunction, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 5, 1)) +>TEvent : Symbol(TEvent, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 20)) +>type : Symbol(type, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 36)) +>event : Symbol(event, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 56)) +>TEvent : Symbol(TEvent, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 20)) + +declare function createMachine< +>createMachine : Symbol(createMachine, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 79)) + + TTypesMeta extends TypegenEnabled | TypegenDisabled = TypegenDisabled +>TTypesMeta : Symbol(TTypesMeta, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 9, 31)) +>TypegenEnabled : Symbol(TypegenEnabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 2, 1)) +>TypegenDisabled : Symbol(TypegenDisabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 0, 0)) +>TypegenDisabled : Symbol(TypegenDisabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 0, 0)) + +>( + config: { +>config : Symbol(config, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 11, 2)) + + types?: TTypesMeta; +>types : Symbol(types, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 12, 11)) +>TTypesMeta : Symbol(TTypesMeta, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 9, 31)) + + }, + implementations: TTypesMeta extends TypegenEnabled +>implementations : Symbol(implementations, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 14, 4)) +>TTypesMeta : Symbol(TTypesMeta, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 9, 31)) +>TypegenEnabled : Symbol(TypegenEnabled, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 2, 1)) + + ? ActionFunction<{ type: "test" }> +>ActionFunction : Symbol(ActionFunction, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 5, 1)) +>type : Symbol(type, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 16, 22)) + + : ActionFunction<{ type: string }> +>ActionFunction : Symbol(ActionFunction, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 5, 1)) +>type : Symbol(type, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 17, 22)) + +): void; + +createMachine({}, (ev) => { +>createMachine : Symbol(createMachine, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 7, 79)) +>ev : Symbol(ev, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 20, 19)) + + ev.type; // should be `string` +>ev.type : Symbol(type, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 17, 22)) +>ev : Symbol(ev, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 20, 19)) +>type : Symbol(type, Decl(contextualSignatureConditionalTypeInstantiationUsingDefault.ts, 17, 22)) + +}); + diff --git a/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.types b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.types new file mode 100644 index 0000000000000..10f45ff22ee09 --- /dev/null +++ b/tests/baselines/reference/contextualSignatureConditionalTypeInstantiationUsingDefault.types @@ -0,0 +1,54 @@ +=== tests/cases/compiler/contextualSignatureConditionalTypeInstantiationUsingDefault.ts === +export interface TypegenDisabled { + "@@xstate/typegen": false; +>"@@xstate/typegen" : false +>false : false +} +export interface TypegenEnabled { + "@@xstate/typegen": true; +>"@@xstate/typegen" : true +>true : true +} + +type ActionFunction = (event: TEvent) => void; +>ActionFunction : ActionFunction +>type : string +>event : TEvent + +declare function createMachine< +>createMachine : (config: { types?: TTypesMeta;}, implementations: TTypesMeta extends TypegenEnabled ? ActionFunction<{ type: "test";}> : ActionFunction<{ type: string;}>) => void + + TTypesMeta extends TypegenEnabled | TypegenDisabled = TypegenDisabled +>( + config: { +>config : { types?: TTypesMeta | undefined; } + + types?: TTypesMeta; +>types : TTypesMeta | undefined + + }, + implementations: TTypesMeta extends TypegenEnabled +>implementations : TTypesMeta extends TypegenEnabled ? ActionFunction<{ type: "test"; }> : ActionFunction<{ type: string; }> + + ? ActionFunction<{ type: "test" }> +>type : "test" + + : ActionFunction<{ type: string }> +>type : string + +): void; + +createMachine({}, (ev) => { +>createMachine({}, (ev) => { ev.type; // should be `string`}) : void +>createMachine : (config: { types?: TTypesMeta | undefined; }, implementations: TTypesMeta extends TypegenEnabled ? ActionFunction<{ type: "test"; }> : ActionFunction<{ type: string; }>) => void +>{} : {} +>(ev) => { ev.type; // should be `string`} : (ev: { type: string; }) => void +>ev : { type: string; } + + ev.type; // should be `string` +>ev.type : string +>ev : { type: string; } +>type : string + +}); + diff --git a/tests/cases/compiler/contextualSignatureConditionalTypeInstantiationUsingDefault.ts b/tests/cases/compiler/contextualSignatureConditionalTypeInstantiationUsingDefault.ts new file mode 100644 index 0000000000000..ece9ac80f125f --- /dev/null +++ b/tests/cases/compiler/contextualSignatureConditionalTypeInstantiationUsingDefault.ts @@ -0,0 +1,25 @@ +// @strict: true + +export interface TypegenDisabled { + "@@xstate/typegen": false; +} +export interface TypegenEnabled { + "@@xstate/typegen": true; +} + +type ActionFunction = (event: TEvent) => void; + +declare function createMachine< + TTypesMeta extends TypegenEnabled | TypegenDisabled = TypegenDisabled +>( + config: { + types?: TTypesMeta; + }, + implementations: TTypesMeta extends TypegenEnabled + ? ActionFunction<{ type: "test" }> + : ActionFunction<{ type: string }> +): void; + +createMachine({}, (ev) => { + ev.type; // should be `string` +});