I've the following definitions:
class RESTClient<E extends { id: number }> extends Client {}
class ParticipantClient extends RESTClient<Participant> {}
const createRESTRequestAction = <E extends { id: number }>(client: RESTClient<E>, value?: E) => {};
Unfortunately the createRESTRequestAction
is not typing itself as I want. When I use the following call ..
createRESTRequestAction(ParticipantClient, someRecord);
.. TypeScript expects someRecord
to be of type { id: number }
. I would like that it expect E
to be of type Participant
in this case. How can this be achieved?
Is it possible to infer the generic type of the extended RESTClient?
Thank you in advance!
The function its self is generic in this case. You are missing the type parameter when invoking your function. Invoke it like: createRESTRequestAction<Participant>(ParticipantClient, someRecord);
Here is a working example (slightly cleaned up):
class RestObject {
id: number
}
class Participant extends RestObject {
name: string;
}
class RESTClient<E extends RestObject> {}
class ParticipantClient extends RESTClient<Participant> {}
const createRESTRequestAction = <T extends RestObject>(client: RESTClient<T>, value?: T) => {};
const participantClient = new ParticipantClient();
const anyObj = {};
const otherRestObject = {
id: 1
}
const participant: Participant = {
id: 10,
name: 'Robin'
}
createRESTRequestAction<Participant>(participantClient, anyObj); // TypeError, {} not assignable to Participant
createRESTRequestAction<Participant>(participantClient, otherRestObject); // TypeError, "Name" property is missing in otherRestObject parameter
createRESTRequestAction(participantClient, otherRestObject); // Works, transpiler expects the second object to extend RestObject
createRESTRequestAction<Participant>(participantClient, participant); // Works!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.