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ě
