π Search Terms
N/A β not sure which part of the playground code causes the issue
π Version & Regression Information
- No bug on 4.9.5
- The bug can be observed starting from 5.0.4
β― Playground Link
https://www.typescriptlang.org/play?#code/C4TwDgpgBA4gTgQzACwIoBkByB7AdgZQFcAjfCAGwgGNgFjKoBeAKCigB8oBnYOAS1wBzVhygBBOIhAAeHvyGjchcuVGFcAEwgAzARA0A+EZyUrjUdVt259AbmahIsRCgxFSFarXrQWbTvBIaOgA8sQAVl7mElLSga6hEV6Kyqqcljp6hvaO0PHBAGoI5IS+zkEYOAQkZJQ0dAwBLsHutV4NEPYA9F1QEFzkAsAAtBp8XB3DNgAeI4M2UAACuVxU-GAj-fPAXVR4XOPAELgjAlrT+sPYSTTDPCCUADTL4P1rfBvDW0O7+4fHI1yo0yuD4wD4+wcr3KCTCkRoTCgAG8oABtADWEBAAC5uLwBIIALq4-IYIolaAAX3szD2uB4UAAKgAlMSYfAAMRCzIAsgBRZmI-AgAC2xGw5AAFAByFlsznc-nM6UAShpQwgcG0CCo0FannqPg5fAoGi4bRoENwIQ2Vq4yJEqLl7K5vIFhIA-LjGYh6dpsHARZrmTpNcdddJrvDgI8YcE4V4DPZKcwoU5jabzQbwXgbTn6dJGQZEYy+rNjma424atmOiIPVB9XVvJQM+QzRb83m7SJcVVMKkOtJ1OjcNgAO64JOprRUcgIODQOkM50Kt3MgD6zL5HIFfMwAGE+RvGQBNAAKfNx6j4AEdStxReLyPZZ-PF1Bl8AmayXYqBVuO57oex6rq6SrXqC97QFwT4SvYGpajq0A+ggfoBkGcAhtoYa4BGIiMqh6GBpqZZHJo9pRl4jwEYy0IQOWFFVok0Y0cWSKOmB-6btuu7biBJ4XnyxJMnRkD2GwTq-muSqAXx+5Hie0nge63pEVw-okXAyaprkUAAKq4OOLhNu0PiFmRFb2qS6CmYalDFowTKWUxMQIDIIgCDhcBQAUzBGGwDb9oO5kFAFUDeuqJyatqupQAmNAAOpgsg6maZh3Z4NItG+hpGGkQx5GVlRNA0WwhH0YxlY2QlMb+Q6klceuIlpflWGhoueEQIWrVabGFWQNOKZptAbYaOeCDAMgtUWYVVnMbVjkNWiADSUACFAmIgNg2hMp63qoithIuZWXmkX5bCBb5J3Wc01YeM2daXZdDZjRNU0zYZxlIHZLbdWF4XPX2eADioQ4jmOk6AxFUA2AAbpqyZQAAZFAY1Zs2VqZQWRY0npY3uO9yDkqU0gFP1hOTcgS0FDdzFVL9T1QA2F0w7Tc1MTZjM+PWTKU1NdNvVTn1GSZNaPaFBjQyzdM1TcwAiM9r0mu2RMk91X1iw9ZmUGTBgUyQRPQ2w3r88gdO1clU29RltpZYrz2XWdPmEbl6WamVjvPZrP3izr-3G5dgcNq7aF5VpDsmxYuCjhOuAO7i8Oar2sMQAj2m6dCQtTer2XlbLd0sdRBFE4LKvjcL8uFvr9VORxklrRtW07UyRMiWtHOVs3u2Mg7yummbueModhL9UTI-Q4naeI8wlIYliLeMm3UVHEhcUctg2CrzbpH11AuimpBseTjpI1QHyJxwCAiJ77BXDA7goPzuZENx0NePQqgpRXzfIj+lvmoDwSkxngL0aNN6ryASoLwVpkwfycHycscBcDFHQAIdEiIL68GvqjPe8xMQaA5HAbAIowEbwAXAKBIDcBwMzumCBpEnJYJ-rgv+DC4BoJjlweA2BCBgCoTA0BuJyGr04eibhxC+ECMtHgWhZ8RGAOAYI3Av82BgggCKe+4CKGokJHI-G7CxESN4WATBl8cHLUEJIsAYiwGINXig8gYjRDBTBi-GOkMpz6KzoY9BxipFKJkSouunkjgimEb4rhPC+HeKcKXEJbB-6QMCfmXEe81FhK0eky6Ul5QqWZC1N2bVsK4QjAouAO84CxnKdOZ61IRD1PqWfAAkmExE2dibFFJl-TUIBYxGxpG+BcS59jfmmLiVpGj7BfigDibR28ilaTUJoEE+hETTHsEAA
π» Code
Apologies if the example is too long. I did my best to reduce it as much as possible, having encountered this bug in production.
type GraphQLNonSubSelectable =
| string
| Array<string | null | undefined>
| null
| undefined;
type GraphQLSubSelectable =
| GraphQLObject
| Array<GraphQLObject | null | undefined>;
type GraphQLValue = GraphQLNonSubSelectable | GraphQLSubSelectable;
type GraphQLObject = { [key: string]: GraphQLValue };
const TRANSFORMER = Symbol('TRANSFORMER');
interface SubSelectableFieldsSelectionOptions {
[TRANSFORMER]?: TransformerReference<object, GraphQLObject>;
}
type FieldsSelectionOptions<T> = T extends GraphQLSubSelectable
? SubSelectableFieldsSelectionOptions
: NonNullable<unknown>;
declare const TRANSFORMER_REFERENCE_TYPE: unique symbol;
declare const TRANSFORMER_REFERENCE_TRANSFORMER: unique symbol;
interface TransformerReference<
TTransformer extends object,
TType extends GraphQLObject,
> {
[TRANSFORMER_REFERENCE_TYPE]: TType;
[TRANSFORMER_REFERENCE_TRANSFORMER]: TTransformer;
}
type UnwrapSubSelectable<T extends GraphQLSubSelectable> = T extends Array<
infer V
>
? NonNullable<V>
: T;
interface ObjectWithTransformerOption<
TTransformer extends object,
TType extends GraphQLObject,
> {
[TRANSFORMER]: TransformerReference<TTransformer, TType>;
}
type FieldPathObject<T extends GraphQLObject> = {
[K in keyof T]?: T[K] extends infer V
? V extends GraphQLSubSelectable
? FieldPathObject<UnwrapSubSelectable<V>>
: NonNullable<unknown>
: never;
} & FieldsSelectionOptions<T>;
type FieldSubPathValue<V, TSubPath> = V extends GraphQLNonSubSelectable
? V
: V extends GraphQLSubSelectable
? TSubPath extends FieldPathObject<UnwrapSubSelectable<V>>
? V extends GraphQLObject
? FieldPathValue<UnwrapSubSelectable<V>, TSubPath>
: TSubPath extends ObjectWithTransformerOption<
infer TTransformer,
UnwrapSubSelectable<V>
>
? TTransformer
: unknown
: never
: never;
type FieldPathValue<
T extends GraphQLObject,
TPath extends FieldPathObject<T>,
> = {
[K in keyof TPath]: K extends keyof T
? FieldSubPathValue<T[K], TPath[K]>
: never;
}[keyof TPath];
interface FooterTransformer {
field: unknown;
}
type Entry = {
sys: NonNullable<unknown>;
};
type Query = {
footerCollection?: FooterCollection;
};
type ExternalLink = Entry & {
linkedFrom?: FooterCollection;
};
type Footer = Entry & {
footerLinksGroupCollection?: FooterLinksGroupCollection;
};
type FooterCollection = {
items: Footer[];
};
type FooterLinksGroup = Entry & {
groupLink?: ExternalLink | NonNullable<unknown>;
};
type FooterLinksGroupCollection = {
item: FooterLinksGroup;
};
type Path = {
footerCollection: {
items: {
[TRANSFORMER]: TransformerReference<FooterTransformer, Footer>;
};
};
};
type Item = FieldPathValue<Query, Path>;
declare const x: Item;
const y: FooterTransformer | undefined = x;
π Actual behavior
- Observe that the example gives the following error:
TS2322: Type 'Footer[] | undefined' is not assignable to type 'FooterTransformer | undefined'.
Property 'field' is missing in type 'Footer[]' but required in type 'FooterTransformer'.
121 const y: FooterTransformer | undefined = x;
~
-
Put type Footer between type Query and type ExternalLink. Updated example
-
Watch the error disappear.
π Expected behavior
Versions 4.9.5 an below correctly infer the types (produce no error). Changes to the order of type declarations do not affect the result.
Additional information about the issue
No response
π Search Terms
N/A β not sure which part of the playground code causes the issue
π Version & Regression Information
β― Playground Link
https://www.typescriptlang.org/play?#code/C4TwDgpgBA4gTgQzACwIoBkByB7AdgZQFcAjfCAGwgGNgFjKoBeAKCigB8oBnYOAS1wBzVhygBBOIhAAeHvyGjchcuVGFcAEwgAzARA0A+EZyUrjUdVt259AbmahIsRCgxFSFarXrQWbTvBIaOgA8sQAVl7mElLSga6hEV6Kyqqcljp6hvaO0PHBAGoI5IS+zkEYOAQkZJQ0dAwBLsHutV4NEPYA9F1QEFzkAsAAtBp8XB3DNgAeI4M2UAACuVxU-GAj-fPAXVR4XOPAELgjAlrT+sPYSTTDPCCUADTL4P1rfBvDW0O7+4fHI1yo0yuD4wD4+wcr3KCTCkRoTCgAG8oABtADWEBAAC5uLwBIIALq4-IYIolaAAX3szD2uB4UAAKgAlMSYfAAMRCzIAsgBRZmI-AgAC2xGw5AAFAByFlsznc-nM6UAShpQwgcG0CCo0FannqPg5fAoGi4bRoENwIQ2Vq4yJEqLl7K5vIFhIA-LjGYh6dpsHARZrmTpNcdddJrvDgI8YcE4V4DPZKcwoU5jabzQbwXgbTn6dJGQZEYy+rNjma424atmOiIPVB9XVvJQM+QzRb83m7SJcVVMKkOtJ1OjcNgAO64JOprRUcgIODQOkM50Kt3MgD6zL5HIFfMwAGE+RvGQBNAAKfNx6j4AEdStxReLyPZZ-PF1Bl8AmayXYqBVuO57oex6rq6SrXqC97QFwT4SvYGpajq0A+ggfoBkGcAhtoYa4BGIiMqh6GBpqZZHJo9pRl4jwEYy0IQOWFFVok0Y0cWSKOmB-6btuu7biBJ4XnyxJMnRkD2GwTq-muSqAXx+5Hie0nge63pEVw-okXAyaprkUAAKq4OOLhNu0PiFmRFb2qS6CmYalDFowTKWUxMQIDIIgCDhcBQAUzBGGwDb9oO5kFAFUDeuqJyatqupQAmNAAOpgsg6maZh3Z4NItG+hpGGkQx5GVlRNA0WwhH0YxlY2QlMb+Q6klceuIlpflWGhoueEQIWrVabGFWQNOKZptAbYaOeCDAMgtUWYVVnMbVjkNWiADSUACFAmIgNg2hMp63qoithIuZWXmkX5bCBb5J3Wc01YeM2daXZdDZjRNU0zYZxlIHZLbdWF4XPX2eADioQ4jmOk6AxFUA2AAbpqyZQAAZFAY1Zs2VqZQWRY0npY3uO9yDkqU0gFP1hOTcgS0FDdzFVL9T1QA2F0w7Tc1MTZjM+PWTKU1NdNvVTn1GSZNaPaFBjQyzdM1TcwAiM9r0mu2RMk91X1iw9ZmUGTBgUyQRPQ2w3r88gdO1clU29RltpZYrz2XWdPmEbl6WamVjvPZrP3izr-3G5dgcNq7aF5VpDsmxYuCjhOuAO7i8Oar2sMQAj2m6dCQtTer2XlbLd0sdRBFE4LKvjcL8uFvr9VORxklrRtW07UyRMiWtHOVs3u2Mg7yummbueModhL9UTI-Q4naeI8wlIYliLeMm3UVHEhcUctg2CrzbpH11AuimpBseTjpI1QHyJxwCAiJ77BXDA7goPzuZENx0NePQqgpRXzfIj+lvmoDwSkxngL0aNN6ryASoLwVpkwfycHycscBcDFHQAIdEiIL68GvqjPe8xMQaA5HAbAIowEbwAXAKBIDcBwMzumCBpEnJYJ-rgv+DC4BoJjlweA2BCBgCoTA0BuJyGr04eibhxC+ECMtHgWhZ8RGAOAYI3Av82BgggCKe+4CKGokJHI-G7CxESN4WATBl8cHLUEJIsAYiwGINXig8gYjRDBTBi-GOkMpz6KzoY9BxipFKJkSouunkjgimEb4rhPC+HeKcKXEJbB-6QMCfmXEe81FhK0eky6Ul5QqWZC1N2bVsK4QjAouAO84CxnKdOZ61IRD1PqWfAAkmExE2dibFFJl-TUIBYxGxpG+BcS59jfmmLiVpGj7BfigDibR28ilaTUJoEE+hETTHsEAA
π» Code
Apologies if the example is too long. I did my best to reduce it as much as possible, having encountered this bug in production.
π Actual behavior
Put
type Footerbetweentype Queryandtype ExternalLink. Updated exampleWatch the error disappear.
π Expected behavior
Versions 4.9.5 an below correctly infer the types (produce no error). Changes to the order of
typedeclarations do not affect the result.Additional information about the issue
No response