【问题标题】:Functions in typescript打字稿中的功能
【发布时间】:2022-01-24 21:32:24
【问题描述】:

为什么没有遗漏错误?

interface User {
  // way 1
  foo(): string;  
  foo2(x:number): string; 

  // way 2
  normal: () => string;
  normal2: (x:number) => string;
}

let user: User = {
  // way 1
  foo: () => '',
  foo2: () => '', // why no error since x is missing
  
  // way 2
  normal: () => '',
  normal2: () => '', // why no error since x is missing
};

查看此打字稿Playground

【问题讨论】:

  • 我尝试在 user 上调用这些函数并按预期收到错误 - 不知道为什么它们的定义没有错误。
  • @AmadouBeye 不。必须有一些变量可以具有未定义的值。值不会停留在空中,而必须是变量,仅供参考。

标签: javascript typescript


【解决方案1】:

只要返回类型兼容并且 存在的参数兼容,就可以将较低的arity 函数分配给较高数量的函数。

在您的情况下,因为函数没有参数并返回string,所以它们是兼容的。

TS Playground

type NumFn = (n: number) => string;
declare const isCompatible: (() => string) extends NumFn ? true : false; // true

【讨论】:

  • 奇怪。还是为什么会有这样的行为?我们如何断言它来阻止这种行为?
  • @umeshkadam 你为什么想要?有什么问题?
  • 没什么大不了的。只是学习。很乐意让它更精确。
【解决方案2】:

如果您调用 (x:number)=>string 而不传入x,则会收到An argument for 'x' was not provided. 错误。

但这不是你正在做的事情

您正在做的是将()=>string 分配给(x:number)=>string,这是有效的。当您将()=>string 分配给(x:number)=>string 时,编译器会问:()=>string 的行为是否与(x:number)=>string 相同?

()=>string 可以接受number 并吐出string,就像(x:number)=>string 所做的那样吗?

答案是肯定的,()=>string 技术上可以接受任何数字,但只是忽略它,然后返回一个字符串,与它接受的数字无关。因此,()=>string 可以分配给(x:number)=>string

【讨论】:

    【解决方案3】:

    就像上面的答案似乎只有当你调用没有参数的函数时才能检测到它 我敢打赌,这与打字稿上下文类型有关 (我也在这里学习)

    函数参数一次检查一个,每个对应参数位置的类型相互检查。如果您根本不想指定类型,TypeScript 的上下文类型可以推断参数类型,因为函数值直接分配给 SearchFunc 类型的变量。在这里,我们的函数表达式的返回类型也隐含在它返回的值中 typescript handbook

    interface Counter {
      (start: number): string;
      interval: number;
      foo: (x:number) => string;
      bar(x:number):string;
      reset(): void;
    }
    
    function getCounter(): Counter {
      let counter = function (s...
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 2021-06-30
      • 1970-01-01
      • 2021-07-16
      • 2017-12-19
      • 2019-01-09
      相关资源
      最近更新 更多