Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

153
Vistas
Typescript polymorphism with class

I try to create a function to create a piece of chess almost like the document.createElement:

class pawn extends piece {

}

class bishop extends piece {

}

class rook extends piece {

}

class king extends piece {

}

class queen extends piece {

}

class knigth extends piece {

}

export interface pieces {
    "pawn": pawn
    "bishop": bishop
    "rook": rook
    "king": king
    "queen": queen
    "knigth": knigth
}

export function createPiece<K extends keyof pieces>(pieceName: K, options?: pieceInit): pieces[K]{
    /// ???
}

But I don't know what I need to return in my createPiece function... I try

export function createPiece<K extends keyof pieces>(pieceName: K, options?: pieceInit): pieces[K]{
     return pieces[pieceName]
}

But I got the following error : 'pieces' only refers to a type, but is being used as a value here

My goal is :

const piece1:pawn = createPiece("pawn");
const piece2:queen = createPiece("queen");
.
.
.
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

You defined pieces as an interface. You can only access information about interfaces during compile-time and not during runtime. That's why the line return pieces[pieceName] fails to compile.

You should instead define pieces as an object.

export const pieces = {
    "pawn": pawn,
    "bishop": bishop,
    "rook": rook,
    "king": king,
    "queen": queen,
    "knigth": knigth
}

We can use this object to look up the keys during runtime and we can also extract the type information of pieces for use during compile-time.

export function createPiece<
  K extends keyof typeof pieces
>(pieceName: K): typeof pieces[K] {
  return pieces[pieceName]
}

So instead of using pieces directly in the generic type, you can use typeof pieces to get the type of the pieces object.

Playground

about 4 years ago · Juan Pablo Isaza Denunciar

0

You can if you define the interface as a const. Fully typed it would look like so:

type PiecesKey = keyof Pieces;
type Piece<T extends PiecesKey> = Pieces[T];

type Pieces = {
    pawn: pawn;
    bishop: bishop;
    rook: rook;
    king: king;
    queen: queen;
    knigth: knigth;
};

const pieces = {
    pawn: pawn,
    bishop: bishop,
    rook: rook,
    king: king,
    queen: queen,
    knigth: knigth,
};

type pieceInit = {};

export function createPiece<K extends PiecesKey>(
    pieceName: K,
    options?: pieceInit,
): Piece<K> {
    return new pieces[pieceName]();
}
about 4 years ago · Juan Pablo Isaza Denunciar

0

IN you function, you are returning return pieces pieces is a type. You cannot use a type like you would use a value. What are you trying to do more specifically? I will give you a hand :)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda