匿名函数是什么打字稿类型?

what typescript type would an anonymous function be?

谢谢我正在学习在 .d.ts 文件中声明函数

我的javascript有

function generate(romeo) {
  return function(juliet) {
    return romeo + juliet 
  }
}

打字稿声明

  /**
   * Function that accepts strings and returns composed function.
   */
  export function generate(romeo: string): (juliet: string) => string;

对象?

正如 VLAZ 在评论中指出的那样,类型 Function 存在,但它不是很有用:TypeScript 的重点是确定 returned 的类型,以及 Function不表示其参数或 return 值。

function type expressions 上的文档中所述,您可以像这样定义函数类型:

type FunctionType = (param1: SomeParameter) => SomeReturnValue;

对于你的情况,它看起来像这样:

/**
 * Function that accepts strings and returns composed function.
 */
export function generate(romeo: string): (juliet: string) => string;

您需要指定 一些 类型的 return 值,以便 TypeScript 将其识别为函数类型,可以是 anyunknown 但理想情况下将是更具体的类型,如上面的 string 。 (和往常一样,如果函数没有有用的 return 值,那么 void 是合适的。)还有一种方法可以指定 , which is described in the docs as call signatures.

作为类型别名

type Fn = (s1: string) => (s2: string) => string

这可能是最好的阅读方式:采用字符串 s1 的函数和 return 另一个采用字符串 s1 的函数。第二个函数return是一个字符串。

这里的好处是函数符号一致。

如果需要更清晰,也可以用额外的分组括号编写:type Fn = (s1: string) => ((s2: string) => string)

作为界面

interface Fn {
    (s1: string): (s2: string) => string
}

意思同上。由于 :=> 混合表示 return 值,因此(至少在我看来)阅读起来更加混乱。

作为函数定义的一部分

function generate(romeo: string): (juliet: string) => string {
  return function(juliet: string): string {
    return romeo + juliet 
  }
}

如果你真的不需要一个单独的类型。请注意,类型注释中的参数名称和实际函数定义不需要匹配。以下是等价的:

function generate(romeo: string): (s: string) => string {
  return function(juliet: string): string {
    return romeo + juliet 
  }
}

如果您没有来自 TypeScript ESLint(或等效的)的 explicit-function-return-types linter 规则,那么您可以让 TypeScript 推断类型:

function generate(romeo: string) {
  return function(juliet: string) {
    return romeo + juliet 
  }
}