typescript - Este posibil ca typeof unei clase să fie egal cu o interfață?


Este posibil ca o interfață care descrie o clasă să fie egală cu typeof acelei clase?

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

Teren de joacă

Din câte știu, IPoint<Point> are aceeași structură ca class Point. Dar nu sunt egale. Am omis ceva?

ACTUALIZARE:

Înțelegerea mea: Când o interfață descrie un semnătură de funcție sau constructor, descrie un obiect function. class sunt fundamental funcții, așadar proprietățile unui function sunt doar proprietăți statice ale acelui class.

Răspuns #1

Ar trebui să eliminați proprietățile x și y din interfața IPoint<T> deoarece ele reprezintă proprietăți statice.

Clasa Point nu are proprietăți statice. Încearcă:

type Check = keyof typeof Point // "prototype"

După cum vedeți, există doar prototype.

Ar trebui să muți x și y în tipul de returnare al new(x: number, y: number): { x: number, y: number };

Tipul de returnare al new()... reprezintă tipul de instanță al clasei

Luați în considerare exemplul complet:

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

Teren de joacă

ACTUALIZARE Dacă vrei să declari proprietăți statice, fă-o în acest fel:

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

Teren de joacă