Es posible, pero requiere algo de repetitivo. Los problemas son:
Las interfaces y los tipos en TS no existen en el código emitido
Si bien podría ir en la otra dirección: cree un objeto de esquema y haga una interfaz / tipo a partir de él, los valores del objeto de esquema deben ser constructores , por ejemplo, Number
, que no es lo mismo que algo con un tipo de number
.
Pero puede crear un tipo que asigne los tipos de constructores a sus tipos primitivos (por ejemplo, Number
to number
), y luego usarlo para convertir el objeto de esquema en el tipo que desea:
type ConstructorMapping<T> = T extends NumberConstructor ? number : T extends StringConstructor ? string : never; // etc: continue as needed const schemaObj = { score: Number, user_id: String, station_id: String, description: String, }; type SchemaObj = typeof schemaObj; type StationRating = { [prop in keyof SchemaObj]: ConstructorMapping<SchemaObj[prop]> };
Luego use schemaObj
cuando llame a new Schema
y también tendrá el siguiente tipo utilizable:
type StationRating = { score: number; user_id: string; station_id: string; description: string; }
¿Vale la pena? No estoy seguro. Para objetos más pequeños, tal vez no. Para objetos más grandes, tal vez así. Es posible que prefiera simplemente escribir el tipo y el objeto de esquema.