Intento crear una función para crear una pieza de ajedrez casi como 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]{ /// ??? }Pero no sé qué necesito devolver en mi función createPiece... lo intento
export function createPiece<K extends keyof pieces>(pieceName: K, options?: pieceInit): pieces[K]{ return pieces[pieceName] }Pero recibí el siguiente error: 'piezas' solo se refiere a un tipo, pero se usa como un valor aquí
Mi meta es :
const piece1:pawn = createPiece("pawn"); const piece2:queen = createPiece("queen"); . . .Definiste las pieces como una interface . Solo puede acceder a la información sobre las interfaces durante el tiempo de compilación y no durante el tiempo de ejecución. Es por eso que la línea return pieces[pieceName] no se compila.
En su lugar, debe definir las pieces como un objeto.
export const pieces = { "pawn": pawn, "bishop": bishop, "rook": rook, "king": king, "queen": queen, "knigth": knigth } Podemos usar este objeto para buscar las claves durante el tiempo de ejecución y también podemos extraer la información de tipo de pieces para usar durante el tiempo de compilación.
export function createPiece< K extends keyof typeof pieces >(pieceName: K): typeof pieces[K] { return pieces[pieceName] } Entonces, en lugar de usar pieces directamente en el tipo genérico, puede usar typeof pieces para obtener el tipo del objeto de pieces .
Puede hacerlo si define la interfaz como una const. Completamente escrito se vería así:
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](); }EN su función, está devolviendo piezas de return pieces piezas es un tipo. No puede usar un tipo como usaría un valor. ¿Qué estás tratando de hacer más específicamente? te voy a dar una mano :)