Vyhledávání na webu

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]
};