代码之家  ›  专栏  ›  技术社区  ›  Steinroe

从参数派生泛型的值

  •  0
  • Steinroe  · 技术社区  · 2 年前

    TypeScript有没有一种方法可以从传递的参数类型派生泛型参数的值?

    请考虑以下设置。

    type Param<Result> = { bar: Result };
    
    function foo<ResultType, ParamType extends Param<ResultType>>(
      value: ParamType
    ) {
      //
    }
    
    foo({ bar: "foo" });
    

    我想要 ResultType 从传递给的值派生 foo ,在这种情况下 string 。由于我没有为 ResultType param,TypeScript默认为 unknown 具有

    function foo<unknown, {
        bar: string;
    }>(value: {
        bar: string;
    }): void
    

    而我想要

    function foo<string, {
        bar: string;
    }>(value: {
        bar: string;
    }): void
    

    目标是键入的返回值 foo 基于 Result 。我认为这种方法根本不起作用,但也许还有其他方法可以达到同样的结果?

    我很感激你的每一个暗示!

    0 回复  |  直到 2 年前
        1
  •  2
  •   mochaccino    2 年前

    如果您的唯一目标是获得 foo 基于 ParamType ,你可以这样说 参数类型 Param<unknown> ,然后使用 infer 在返回类型中获取什么是“内部”:

    type Param<Result> = { bar: Result };
    
    function foo<ParamType extends Param<unknown>>(
      value: ParamType
    ): ParamType extends Param<infer U> ? U : never {
    //                         ^^^^^^^ make TypeScript try to infer what's inside
    

    Playground