Skip to content

Excessive depth exploring template literal type constraints#40970

@ahejlsberg

Description

@ahejlsberg

TypeScript Version: 4.1.0-dev

Code

typePathKeys<T>=Textendsreadonlyany[] ? Extract<keyofT, `${number}`>|SubKeys<T,Extract<keyofT, `${number}`>> : Textendsobject ? Extract<keyofT,string>|SubKeys<T,Extract<keyofT,string>> : never;typeSubKeys<T,Kextendsstring>=KextendskeyofT ? `${K}.${PathKeys<T[K]>}` : never;typePropType<T,Pathextendsstring>=PathextendskeyofT ? T[Path] : Pathextends `${infer K}.${infer R}` ? KextendskeyofT ? PropType<T[K],R> : unknown : unknown;declarefunctiongetProp<T,PextendsPathKeys<T>>(obj: T,path: P): PropType<T,P>;constobj={name: 'John',age: 42,cars: [{make: 'Ford',age: 10},{make: 'Trabant',age: 35}]}asconst;letmake=getProp(obj,'cars.1.make');// 'Trabant'

Expected behavior:

No errors.

Actual behavior:

"Type instantiation is excessively deep and possibly infinite" error on declaration of getProp.

Playground Link:

https://www.typescriptlang.org/play?ts=4.1.0-dev.20201006#code/C4TwDgpgBACghsAFgaQiAzgHgCoD4oC8AUFKVNlBAB7AQB2AJulAE4RwMD2dANiFHDogA2gF0oAfigBRGizgBjYJgDWaTgDNyAGigADACQBvOgFcAtgCMILAL578AHygBlU5dQYcu2cHlLVdS1sXUMTC2s7B3wALhIyCmpaRmZOSwArCCVJGTlFZTUQTR0odD8ASzoAcydXd08sENy-fMCi4N0ylkqa2PjSOggANxsAbiIiUEg6jzRG3WRKGnomUorq-AIoRaSV5kLiiikw5FsAOmN4JAacYWRRXHsoGKhBkZZxyfBoGBZOMGw328sAQiCWyVWXR6m36IKQ4L2UAOwRy2GEV0Q4jiZDhYN2KX0xkqGhs23ORLoJJYUAASk8pDtlgTkeQcr9-oDILd7roabEoKY6Co6JwAO50Z6wwXCsV0T4MLI8OBsKAaQVKcrcKBVCDAdlgYEwBEEjE3PC4AAUaXSLyaYFBLxgAEpHX8AUCmjBcJ8FNwylBrYQoEZYXQ4OYIC8AOQAKU4iDoUe0sLgOpeABYAEzJnEKZXoF7CWE4oxQcxwNTRgBinBYDCTAjTUAAjAAGKC2HM4sil8uVqBR7DySyCYAN1ORqAAZgArB3YaIiLYBMxfXQyp8eLqyxXoFsdXq3VaMroo3mWOgzs2zn2IFGnaNSAB6J8DodwEd0MdEIA

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions