Использование typeof 'T' при использовании дженериков - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь, чтобы мой декоратор, прикрепленный к свойству, отображал список элементов на typeof MyObject при вызове как @MyProperty(MyObject, { /* public properties that are in MyObject */ })

Я пытался использовать export function MyProperty<T extends Behavior>(component: typeof T, options?: Options<T>) {, но это дает мне ошибка:

'T' относится только к типу, но здесь используется в качестве значения.

Я также пытался использовать InstanceType<T> следующим образом: export function MyProperty<T extends Behavior>(component: InstanceType<T>, options?: Options<T>) { но это дает мне такую ​​ошибку:

Тип 'T' не удовлетворяет ограничению 'new (... args: any) => any'.

Я также пытался использовать typeof Behavior вместо typeof T, однако это дает элементы в Behavior, а не в классе, расширяющем Behavior.

Я не совсем уверен, как это сделать. Как я могу получить эти свойства во втором параметре @MyProperty?

export type Options<T> = {
  [P in keyof T]?: T[P]
}

export function MyProperty<T extends Behavior>(component: typeof T, options?: Options<T>) {
  return (target: MyTarget, property: string): void => {

  }
}

export class Item extends MyTarget {
  @MyProperty(Mesh, {color: 'red'})
  public mesh!: Mesh
}

export class Mesh extends Behavior {
  public mesh!: ThreeMesh
  public geometry!: Geometry
  public color: string | number | Color = 0xffffff
}

1 Ответ

0 голосов
/ 12 апреля 2020

T уже является типом. Поэтому typeof T недопустимо, потому что typeof требует значения (из которого он будет возвращать тип)

Поэтому правильный синтаксис:

function MyProperty<T extends Behavior>(component: T, options?: Options<T>) { … }
...