-
Notifications
You must be signed in to change notification settings - Fork 85
How to get type inference? #223
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
you have to do this by yourself. ...fetch(roomId) only has the Return-Type you may define a Type:
and then use it like:
|
Wish there was a better way? other than redefining |
This
I would much prefer if this was inferred from the schema when creating a repository like many other ORMs. It'd result in way fewer bugs and improve DX |
💯 - this would be very useful to have |
yea i end up having to define so many types eg. entity type, return from rest api type etc.. how can the typed repository fetch not even return the correct type? this is not even even a typescript library |
this doesnt work though it needs to |
this is a fake ts library |
I'm currently using this to infer the types automatically, but this should be handled by the library itself imo. /** A point on the globe. */
interface Point {
longitude: number;
latitude: number;
};
/** {@link SchemaDefinition} types mapped to their Typescript type. */
interface InferSchemaMapping {
string: string;
number: number;
boolean: boolean;
"string[]": string[];
"number[]": number[];
date: Date;
point: Point;
text: string;
};
/** Utility type to infer the TypeScript types from a {@link SchemaDefinition}. */
type InferSchema<T extends SchemaDefinition> = {
[Key in keyof T]: T[Key]["type"] extends keyof InferSchemaMapping ? InferSchemaMapping[T[Key]["type"]] : unknown;
}; (See TS playground for demo) |
If you have a flat object (i.e. your schema's keys exactly match your object) you can just type the schema itself: type Room = {
id: string
name: string
members: string[]
}
const roomSchema = new Schema<Room>('room', {
id: { type: 'string' },
name: { type: 'string' },
members: { type: 'string[]' },
})
const roomRepository = new Repository(roomSchema, client)
const room = await roomRepository.fetch(id)
// ^-- `room` is typed as `Room` That won't work if you have nested JSON and use JSONPath. In this case, you can type the repository. type Room = {
id: string
name: string
members: string[]
}
const roomRepository = new Repository<Room>(roomSchema, client)
const room = await roomRepository.fetch(id)
// ^-- `room` is typed as `Room` This way you don't always have to write type assertions all the time. You probably don't even need to manually define those types again: in most cases, you already have those types defined in your codebase, e.g. as return types of API calls. I'd guess that inferring it purely from the schema has some difficult edge cases, like nested JSON and JSONPath. Keep in mind that |
I might be missing something trivial, but here's my case:
The error is:
That is because looks like there's no type inference. When I type "room." the properties doesn't show up. I tried creating a interface for Room and tried plugging into generics or casting but nothing worked...
I could check if room.members exists and then check if its type is array, is that what I'm supposed to do?
The text was updated successfully, but these errors were encountered: