Cannot describe recursive type aliases like JSON in terms of generic mapped types
DanielRosenwasser opened this issue · 1 comments
DanielRosenwasser commented
In the following examples, I've defined 4 different versions of a Json
type, where they differ on their description of object types.
In the first two, I've defined them in terms of mapped types with a concrete key of string, and an object type with a string
index signature. TypeScript has no issues with either of those.
On the other hand, the last two are described with Record
, or with a helper mapped type fed in a string
key type.
// No errors ✅
namespace ObjectIsMappedTypeOnString {
export type Json =
| string
| number
| boolean
| null
| Json[]
| { [K in string]: Json }
;
}
// No errors ✅
namespace ObjectIsIndexSignature {
export type Json =
| string
| number
| boolean
| null
| Json[]
| { [key: string]: Json }
;
}
// Errors ❌
namespace ObjectIsRecord {
export type Json =
| string
| number
| boolean
| null
| Json[]
| Record<string, Json>
;
}
// Error ❌
namespace ObjectIsGenericMappedType {
type JsonProperties<K extends PropertyKey> = {
[P in K]: Json
};
export type Json =
| string
| number
| boolean
| null
| Json[]
| JsonProperties<Json>
;
}
I would expect all of these to work.