【问题标题】:TypeScript - writing request parser using genericsTypeScript - 使用泛型编写请求解析器
【发布时间】: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


    【解决方案1】:

    我需要做的是使用Generic Type 编写多个解析器函数,每个解析器函数将处理一个特定场景。泛型函数类型应视为readonly,而不是特定实例。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2017-12-30
      • 1970-01-01
      • 2018-01-07
      • 2019-11-10
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多