【发布时间】:2023-03-24 23:21:01
【问题描述】:
我想编写一个解析器函数,它将请求作为参数并返回相同的请求,但其body 属性使用JSON.parse 解析。问题是 - 我想使用一个通用函数,将返回的类型转换为正在解析的内容。
我阅读了一些关于我遇到的错误的信息,但我发现很难绕开它并修复它,所以我想我可以发布我的确切用例并希望找到能向我解释的人,为什么在下面的示例中,TypeScript 对我大喊大叫。 Here's a link to code on TS playground.
// --------------- Request/Parsed Request types ---------------
interface CustomRequestHeaders {
['User-Agent']: string,
['Content-Type']: string,
}
interface CustomRequest {
headers: CustomRequestHeaders,
body: string,
}
interface ParsedCustomRequestBody {
foo?: string,
}
interface ParsedCustomRequest extends Omit<CustomRequest, 'body'> {
body: ParsedCustomRequestBody,
}
// ------------- Custom Request that we'll parse --------------
interface CustomRequest1Headers extends Exclude<CustomRequestHeaders, 'User-Agent' | 'Content-Type'> {
['User-Agent']: 'UserAgent1',
['Content-Type']: 'ContentType1',
}
interface CustomRequest1 extends Exclude<CustomRequest, 'headers'> {
headers: CustomRequest1Headers,
}
interface ParsedCustomRequest1Body {
foo: 'bar',
}
interface ParsedCustomRequest1 extends Exclude<ParsedCustomRequest, 'body'> {
body: ParsedCustomRequest1Body,
}
// --- Parser function that will take a type it converts to ---
const parseRequest = <T extends CustomRequest, K extends ParsedCustomRequest>(req: T): K => {
interface Body extends ParsedCustomRequestBody {};
// How could I fix below error without cast to unknown and then to K?
return {
...req,
body: <Body>JSON.parse(req.body),
} /* as unknown as K */;
};
// ---------------------- Usage example -----------------------
const foo = {} as CustomRequest1;
const bar = <ParsedCustomRequest1>parseRequest(foo);
// const foo2 = {} as CustomRequest2;
// const bar2 = <ParsedCustomRequest2>parseRequest(foo2);
// etc...
【问题讨论】:
标签: typescript parsing casting type-conversion typescript-generics