Vyhledávání na webu

typescript - Je možné, aby typeof třídy bylo rovno rozhraní?


Je možné, že rozhraní, které popisuje třídu, se rovná typeof té třídy?

class Point{
    constructor(public x: number, public y: number){}
}

interface IPoint<T> {
    x: number;
    y: number;
    prototype: T;
    new(x: number, y: number): T;
}

export type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false


type R = Equal<typeof Point, IPoint<Point>>; // false

Dětské hřiště

Pokud vím, IPoint<Point> má stejnou strukturu jako class Point. Ale nejsou stejné. Něco mi uniklo?

AKTUALIZACE:

Můj výklad: Když rozhraní popisuje podpis funkce nebo konstruktoru, popisuje objekt function. class jsou v základu funkce, takže vlastnosti function jsou jen statické vlastnosti té class.

Odpověď č. 1

Měli byste odstranit vlastnosti x a y z rozhraní IPoint<T>, protože představují statické vlastnosti.

Třída Point nemá statické vlastnosti. Zkuste:

type Check = keyof typeof Point // "prototype"

Jak vidíte, existuje pouze prototype.

Měli byste přesunout x a y do návratového typu new(x: number, y: number): { x: number, y: number };

Návratový typ new()... představuje typ instance třídy

Zvažte celý příklad:

class Point {
  constructor(public x: number, public y: number) { }
}

interface IPoint<T> {
  prototype: T;
  new(x: number, y: number): { x: number, y: number };
}

export type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false


type Check = keyof typeof Point // "prototype"
type R = Equal<typeof Point, IPoint<Point>>; // true

Dětské hřiště

AKTUALIZACE Pokud chcete deklarovat statické vlastnosti, udělejte to tímto způsobem:

class Point {
  static x: number;
  static y: number;
  constructor(public x: number, public y: number) { }
}

interface IPoint<T> {
  x: number;
  y: number;
  prototype: T;
  new(x: number, y: number): { x: number, y: number };
}

export type Equal<X, Y> =
  (<T>() => T extends X ? 1 : 2) extends
  (<T>() => T extends Y ? 1 : 2) ? true : false


type Result = Equal<typeof Point, IPoint<Point>>; // true

Dětské hřiště