-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Open
Labels
Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.This issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScriptAn idea for TypeScript
Milestone
Description
π Search Terms
intersection type variable parameter inference recursive constraint
π Version & Regression Information
- This is the behavior in every version I tried
β― Playground Link
π» Code
type StateConfig<TAction extends string> = {
entry?: TAction
states?: Record<string, StateConfig<TAction>>;
};
type StateSchema = {
states?: Record<string, StateSchema>;
};
declare function createMachine<
TAction extends string,
TConfig extends StateSchema,
>(config: TConfig & StateConfig<TAction>): [TAction, TConfig];
const inferredParams = createMachine({
entry: "foo",
states: {
a: {
entry: "bar",
},
},
});
inferredParams; // ["foo" | "bar", StateSchema]
π Actual behavior
TConfig
gets inferred as its constraint
π Expected behavior
I'd expect TConfig
to infer successfully
Additional information about the issue
This is very related to the other issue I just created (see here). The underlying problem of this particular example is the same. The inferredType
for TConfig
fails the compareTypes
check in getInferredType
here. This time there is no excess property errors apparent to the user because the excess properties are satisfied through the intersection.
Despite the problem having the same root cause I think it's worth discussing this separately. The other issue could be closed as design limitation/working as intended but this one feels to me a lot closer to being an actual bug that would be worth fixing.
Metadata
Metadata
Assignees
Labels
Needs ProposalThis issue needs a plan that clarifies the finer details of how it could be implemented.This issue needs a plan that clarifies the finer details of how it could be implemented.SuggestionAn idea for TypeScriptAn idea for TypeScript