π Search Terms
is:issue runtime caching as const
π Version & Regression Information
This is a type checker runtime inconsistency
This is the behavior in every version I tried since const generics were introduced
β― Playground Link
https://www.typescriptlang.org/play/?target=99#code/C4TwDgpgBA8gRgKwgY2AMQE4HsC2BRAO2AwEsIBnAHgBUA+KAXimqggA9gICATcqDCAENuWAgBsQUANokCAMwgYoAaQiT2nHn3LFZAcygAfKAQCuOOIqNRyIC1jEAaKLIVKAaoLGmIAXSm+AFBQUAD8UADe0gDWai4EKmq+AFxQnt7QAL7BUKkEEABuigDcgYGgkIkg6T4ACoIkGFR0jJE5UsrxULEgWHLMKdLKztQdvr6lmVI9fQOlgexgWBjAUHKmBKgkolA4gmDwSKiEuhSUOciiOsysHFy8UFiIKMCOF1er1ACy+5Dct5oHlIdKQCAZjGYLFZjLZ7E4oBtogQsAB3Ai+N60AAUOSeCFS1DeIT2YEgGFSWKkgmccEGqmqXjqDSaNFoAEpGPRvr8INw3mzUocXphcCdSGduaTeQF6BEcgB6eUAAWA5AAtIsXhqMNglABBMQCYSSMDYMkSKAVXmWgAW2FMehttug5BIegIgmApgEOQEXowCSFqAAdHJsPgiOLyFig8Bg1xTtG8WzgySsSSyWy2ZMypcCNdONcmCTY2KyNGooJUgBGGmpABMUEyzkpbGcIF8HIY9CkbagHezZSAA
π» Code
type ObjectFromEntries < T > = T extends readonly [ infer Key extends string | number | symbol , infer Value ] [ ]
? { [ key in Key ] : Value }
: never ;
type KeyValuePairs < T > = {
[ K in keyof T ] : [ K , T [ K ] ] ;
} [ keyof T ] ;
export function mapObjectEntries <
const T extends object ,
const TMapped extends [ string | number | symbol , unknown ] ,
> (
obj : T ,
mapper : ( [ a , b ] : KeyValuePairs < T > ) => TMapped ,
) : ObjectFromEntries < TMapped [ ] > {
//@ts -expect-error Already properly typed through the signature
return Object . fromEntries ( Object . entries ( obj ) . map ( mapper ) ) ;
}
const test = mapObjectEntries ( { a : 1 , b : 2 } , ( [ x , y ] ) => [ x , y ] ) ;
Here is a screencast illustrating the issue:
vivaldi_gWZYW9aEDa.mp4
π Actual behavior
Type checker is context sensitive. When I add an as const behind the expression (see screencast), it compiles fine even after I remove the as const again.
π Expected behavior
Consistency
Additional information about the issue
No response
π Search Terms
is:issue runtime caching as constπ Version & Regression Information
β― Playground Link
https://www.typescriptlang.org/play/?target=99#code/C4TwDgpgBA8gRgKwgY2AMQE4HsC2BRAO2AwEsIBnAHgBUA+KAXimqggA9gICATcqDCAENuWAgBsQUANokCAMwgYoAaQiT2nHn3LFZAcygAfKAQCuOOIqNRyIC1jEAaKLIVKAaoLGmIAXSm+AFBQUAD8UADe0gDWai4EKmq+AFxQnt7QAL7BUKkEEABuigDcgYGgkIkg6T4ACoIkGFR0jJE5UsrxULEgWHLMKdLKztQdvr6lmVI9fQOlgexgWBjAUHKmBKgkolA4gmDwSKiEuhSUOciiOsysHFy8UFiIKMCOF1er1ACy+5Dct5oHlIdKQCAZjGYLFZjLZ7E4oBtogQsAB3Ai+N60AAUOSeCFS1DeIT2YEgGFSWKkgmccEGqmqXjqDSaNFoAEpGPRvr8INw3mzUocXphcCdSGduaTeQF6BEcgB6eUAAWA5AAtIsXhqMNglABBMQCYSSMDYMkSKAVXmWgAW2FMehttug5BIegIgmApgEOQEXowCSFqAAdHJsPgiOLyFig8Bg1xTtG8WzgySsSSyWy2ZMypcCNdONcmCTY2KyNGooJUgBGGmpABMUEyzkpbGcIF8HIY9CkbagHezZSAA
π» Code
Here is a screencast illustrating the issue:
vivaldi_gWZYW9aEDa.mp4
π Actual behavior
Type checker is context sensitive. When I add an
as constbehind the expression (see screencast), it compiles fine even after I remove theas constagain.π Expected behavior
Consistency
Additional information about the issue
No response