typescript - Generický typ, který kapitalizuje vlastnosti jiného typu?
Snažím se vytvořit generický typ, který reprezentuje nějaký jiný typ se všemi jeho názvy vlastností s velkými písmeny. Je to možné?
Například:
type Example = {
id: number
name: string
AnotherProperty: boolean
}
type CapitalizedProps<T> = ???
// CapitalizedProps<Example> = {
// Id: number,
// Name: string,
// AnotherProperty: boolean
// }
Zkoušel jsem:
type Example = {
id: number
name: string
AnotherProperty: boolean
}
type CapitalizedProps<T> = {
[K in Capitalize<keyof T & string>]: T[Uncapitalize<K> & keyof T]
}
const foo: CapitalizedProps<Example> = {
Id: 1,
name: 'foo', // This shouldn't be allowed, but Uncapitalize<'name'> resolves to 'name'.
AnotherProperty: true, // Type 'boolean' is not assignable to type 'never'.ts(2322)
} // (expects property to be "anotherProperty")
a :
type CapitalizedProps<T> = {
[K in Capitalize<keyof T & string>]: T[keyof T]
}
const foo: CapitalizedProps<Example> = {
Id: 1,
Name: 1337, // This shouldn't be allowed, but T[keyof T] resolves
AnotherProperty: true, // to the union of all types for all properties in T.
}
Odpověď č. 1
Trik je použít přemapování kláves. Mělo by to vypadat takto:
type CapitalizedProps<Type> = {
[Property in keyof Type as Capitalize<string & Property>]: () => Type[Property]
};
