Closed
Description
TypeScript Version: 2.9.0-dev.20180328
The code below fails with a "Maximum call stack size exceeded" error. I actually came across this while trying to make a minimal example of a separate problem which is why the code looks so useless.
Code
type AProp<T extends { a: string }> = T
declare function myBug<
T extends { [K in keyof T]: T[K] extends AProp<infer U> ? U : never }
>(arg: T): T
const out = myBug({obj1: {a: "test"}})
Additional similar case that started crashing later. Following code does not crash in 2.8.1 but does in typescript@next
type Value<V extends string = string> = Record<"val", V>;
declare function value<V extends string>(val: V): Value<V>;
declare function ensureNoDuplicates<
T extends {
[K in keyof T]: Extract<T[K], Value>["val"] extends Extract<T[Exclude<keyof T, K>], Value>["val"]
? never
: any
}
>(vals: T): void;
const noError = ensureNoDuplicates({main: value("test"), alternate: value("test2")});
const shouldBeNoError = ensureNoDuplicates({main: value("test")});
const shouldBeError = ensureNoDuplicates({main: value("dup"), alternate: value("dup")});
Actual behavior:
[Error - 09:54:19] 'quickinfo' request failed with error.
Error processing request. Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
at resolveEntityName (tsserver.js:22816:35)
at getSymbolOfEntityNameOrPropertyAccessExpression (tsserver.js:40471:24)
at getSymbolAtLocation (tsserver.js:40512:28)
at getTypeFromTypeNode (tsserver.js:28216:34)
at containsReference (tsserver.js:28397:79)
at visitNode (tsserver.js:12757:24)
at Object.forEachChild (tsserver.js:12867:24)
at containsReference (tsserver.js:28401:27)
at visitNode (tsserver.js:12757:24)
at Object.forEachChild (tsserver.js:12894:24)
at containsReference (tsserver.js:28401:27)
at visitNode (tsserver.js:12757:24)
at Object.forEachChild (tsserver.js:12884:24)
at isTypeParameterPossiblyReferenced (tsserver.js:28388:31)
at tsserver.js:27929:146
at Object.filter (tsserver.js:1671:31)
at getTypeFromConditionalTypeNode (tsserver.js:27929:92)
at getTypeFromTypeNode (tsserver.js:28211:28)
at getTemplateTypeFromMappedType (tsserver.js:26007:52)
at substituteIndexedMappedType (tsserver.js:27818:36)
at getSimplifiedIndexedAccessType (tsserver.js:27810:28)
at getConstraintOfIndexedAccess (tsserver.js:26146:31)
at getConstraintOfType (tsserver.js:26138:40)
at getConstraintForRelation (tsserver.js:29333:80)
at structuredTypeRelatedTo (tsserver.js:29404:38)
at recursiveTypeRelatedTo (tsserver.js:29315:53)
at isRelatedTo (tsserver.js:29031:38)
at checkTypeRelatedTo (tsserver.js:28882:26)
at isTypeRelatedTo (tsserver.js:28864:24)
at Function.compareTypesAssignable [as compareTypes] (tsserver.js:28584:20)
at getInferredType (tsserver.js:30913:34)
at mapper (tsserver.js:30436:32)
at instantiateType (tsserver.js:28464:28)
at getConditionalType (tsserver.js:27888:60)
at getTypeFromConditionalTypeNode (tsserver.js:27943:38)
at getTypeFromTypeNode (tsserver.js:28211:28)
at getTemplateTypeFromMappedType (tsserver.js:26007:52)
at substituteIndexedMappedType (tsserver.js:27818:36)
at getSimplifiedIndexedAccessType (tsserver.js:27810:28)
at getConstraintOfIndexedAccess (tsserver.js:26146:31)
at getConstraintOfType (tsserver.js:26138:40)
at getConstraintForRelation (tsserver.js:29333:80)
at structuredTypeRelatedTo (tsserver.js:29404:38)
at recursiveTypeRelatedTo (tsserver.js:29315:53)
at isRelatedTo (tsserver.js:29031:38)
at checkTypeRelatedTo (tsserver.js:28882:26)
at isTypeRelatedTo (tsserver.js:28864:24)
at Function.compareTypesAssignable [as compareTypes] (tsserver.js:28584:20)
at getInferredType (tsserver.js:30913:34)
at mapper (tsserver.js:30436:32)
at instantiateType (tsserver.js:28464:28)
at getConditionalType (tsserver.js:27888:60)
at getTypeFromConditionalTypeNode (tsserver.js:27943:38)
at getTypeFromTypeNode (tsserver.js:28211:28)
at getTemplateTypeFromMappedType (tsserver.js:26007:52)
at substituteIndexedMappedType (tsserver.js:27818:36)
at getSimplifiedIndexedAccessType (tsserver.js:27810:28)
at getConstraintOfIndexedAccess (tsserver.js:26146:31)
at getConstraintOfType (tsserver.js:26138:40)
at getConstraintForRelation (tsserver.js:29333:80)
at structuredTypeRelatedTo (tsserver.js:29404:38)
at recursiveTypeRelatedTo (tsserver.js:29315:53)
at isRelatedTo (tsserver.js:29031:38)
at checkTypeRelatedTo (tsserver.js:28882:26)
at isTypeRelatedTo (tsserver.js:28864:24)
at Function.compareTypesAssignable [as compareTypes] (tsserver.js:28584:20)
at getInferredType (tsserver.js:30913:34)
at mapper (tsserver.js:30436:32)
at instantiateType (tsserver.js:28464:28)
at getConditionalType (tsserver.js:27888:60)
at getTypeFromConditionalTypeNode (tsserver.js:27943:38)
at getTypeFromTypeNode (tsserver.js:28211:28)
at getTemplateTypeFromMappedType (tsserver.js:26007:52)
at substituteIndexedMappedType (tsserver.js:27818:36)
at getSimplifiedIndexedAccessType (tsserver.js:27810:28)
at getConstraintOfIndexedAccess (tsserver.js:26146:31)
at getConstraintOfType (tsserver.js:26138:40)
at getConstraintForRelation (tsserver.js:29333:80)
at structuredTypeRelatedTo (tsserver.js:29404:38)
at recursiveTypeRelatedTo (tsserver.js:29315:53)
at isRelatedTo (tsserver.js:29031:38)
at checkTypeRelatedTo (tsserver.js:28882:26)
at isTypeRelatedTo (tsserver.js:28864:24)
at Function.compareTypesAssignable [as compareTypes] (tsserver.js:28584:20)
at getInferredType (tsserver.js:30913:34)
at mapper (tsserver.js:30436:32)
at instantiateType (tsserver.js:28464:28)
at getConditionalType (tsserver.js:27888:60)
at getTypeFromConditionalTypeNode (tsserver.js:27943:38)
at getTypeFromTypeNode (tsserver.js:28211:28)
at getTemplateTypeFromMappedType (tsserver.js:26007:52)
at substituteIndexedMappedType (tsserver.js:27818:36)
at getSimplifiedIndexedAccessType (tsserver.js:27810:28)
at getConstraintOfIndexedAccess (tsserver.js:26146:31)
at getConstraintOfType (tsserver.js:26138:40)
at getConstraintForRelation (tsserver.js:29333:80)
at structuredTypeRelatedTo (tsserver.js:29404:38)
at recursiveTypeRelatedTo (tsserver.js:29315:53)
at isRelatedTo (tsserver.js:29031:38)
at checkTypeRelatedTo (tsserver.js:28882:26)
Playground Link:
Link
Related Issues:
Multiple "Maximum call stack size exceeded" issues exist but looking at the recent ones I did not notice any that were obvious duplicates.