【问题标题】:TypeScript function's return type from argument shows wrong typeTypeScript 函数的参数返回类型显示错误类型
【发布时间】:2021-11-28 10:34:41
【问题描述】:

我正在尝试在 TypeScript 中实现一个函数,其返回类型由传递给函数的第二个参数确定。

例如,

const a = ifNotEmpty(var1, "hello"); //a's type should be string
const b = ifNotEmpty(var2, [1, 2]); //b's type should be number[]

但是,相反,我得到 a 的类型为“hello”,b 的类型为 [1, 2]。两种常量类型,硬编码为 "hello" 和 [1,2] 而不是 "string" 或 "number[]";

这是 VSCode 中确定类型的截图

如您所见,a 的类型是“真”硬编码,而不是布尔值。有没有办法推断第二个参数的类型并将该类型作为函数的返回类型返回,所以 a 的类型将是“boolean”而不是“true”?

这是功能,我试图做的:

const ifNotEmpty = <U>(value: any, defaultValue: U): U => {
    return value ?? defaultValue;
};

【问题讨论】:

    标签: javascript typescript typescript-generics


    【解决方案1】:

    true 是推断出来的,因为默认值尽可能严格地取自第二个参数。没有办法告诉 TS 否则。这可以看作是一种优势:)

    另外,我编辑了你的函数类型,不忽略第一个参数,除非它实际上是 null 或未定义,使它正确反映类型。

    const ifNotEmpty = <D, T>(
      value: T,
      defaultValue: U,
    ): T extends null | undefined ? D : T => {
        return value ?? defaultValue;
    };
    
    const a: boolean = ifNotEmpty(null, true);
    

    【讨论】:

      【解决方案2】:

      如果我做对了你想做的事。你只需要返回

      return value != null && value!=undefined ? typeof value : defaultValue;
      

      然后你得到你的第一个值的类型而不是变量的内容

      【讨论】:

      • 嘿,也许我解释得不够好。函数的返回仍然是变量的内容或默认值。但返回的“类型”应该是 defaultValue(函数的第二个参数)。
      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2021-05-09
      • 2020-01-23
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      相关资源
      最近更新 更多