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ă
