Hur kan jag upptäcka en klassinstans med generics i TypeScript
Jag försöker skapa en funktion som tar två parametrar, den första är klassreferensen och den andra är en funktion med endast en parameter som är en instans av klassreferensen och utdata är en specifik typ. Jag försökte koden nedan, men TypeScript visar mig en okänd typ för p, även om jag hoppades att p var en instans av Pair.
interface Point{
x: number
y: number
}
class Pair{
key = 0
value = 0
}
function set<Class extends { new (): Type }, Type>(
inputClass: Class,
constructor: (o: Type) => Point) {
//implementation...
}
set(Pair, p => ({x: p.key, y: p.value}))
// Typescript says:
// (parameter) p: unknown
// Object is of type 'unknown'.(2571)
Jag ville att typescript skulle veta att p måste vara en instans av Pair
Jag kunde implementera med hjälp av Java-generics, men jag kan fortfarande inte replikera det i TypeScript. Följ koden:
public <K extends Pair, T extends Class<K>> void setRenderer(T classe, Function<K, Point> constructor){
//implementation
}
Svar #1
Detta borde fungera:
function set<C>(
inputClass: new ()=>C,
constructor: (o: C) => Point) {
//implementation...
}
Typescript-lekplats
Svar #2
Generics fungerar inte så här, typinferens fungerar inte på det här sättet.
Enkel lösning:
interface Point{
x: number
y: number
}
class Pair{
key = 0
value = 0
}
declare function set<Type>(constructor: (o: Type) => Point): void;
set<Pair>(p => ({ x: p.key, y: p.value }))
Eller om du verkligen vill klara klassen:
interface Point{
x: number
y: number
}
class Pair{
key = 0
value = 0
}
function set<Type>(
inputClass: { new (): Type },
constructor: (o: Type) => Point) {
//implementation...
}
set(Pair, p => ({ x: p.key, y: p.value }))
