美文网首页
TypeScript 定义函数的几种写法

TypeScript 定义函数的几种写法

作者: 华山令狐冲 | 来源:发表于2021-08-07 10:33 被阅读0次

写法1 - 使用 function 关键字

function greeter(fn: (a: string) => void) {
  fn("Hello, World");
}

function printToConsole(s: string) {
  console.log(s);
}

greeter(printToConsole);

(a: string) => void

上述语法的含义:表示一个函数,接收一个字符串作为输入参数,没有返回参数。

可以使用 type 关键字定义一个别名:

type GreetFunction = (a: string) => void;

Call signatures

使用 call signatures 给函数增加额外的属性。TypeScript 的 function 也是 value,和其他 value 一样。

注意:一定有 type 关键字。

源代码:

type DescribableFunction = {
    description: string;
    (someArg: number): boolean;
  };
  
function doSomething(fn: DescribableFunction) {
    console.log(fn.description + " returned " + fn(6));
}

const fn = (a: number) => a > 10;

fn.description = 'Jerry';

另一种定义方式:

type DescribableFunction = {
    description: string;
    (someArg: number): boolean;
  };
const fn = <DescribableFunction>({
   description: 'Jerry'
});

const fn23 = Object.assign(
  function (number:number) { return number > 1 },
  fn
);
function doSomething(fn: DescribableFunction) {
    console.log(fn.description + " returned " + fn(6));
}

Construct signatures

type SomeConstructor = {
  new (s: string): SomeObject;
};
function fn(ctor: SomeConstructor) {
  return new ctor("hello");
}

Method Signatures

方法签名语法可能是最容易使用的。 在定义对象类型时,可以通过提供如下签名来轻松描述其方法:

interface Date {
  toString(): string;
  setTime(time: number): number;
  // ...
}

看个例子:

通过这种方式定义出来的函数,实际是一个 object:


如何实例化这种类型的 object?

const myDate = <MyDate>({
  toString: () => 'Jerry',
  setTime: (number) => number + 1
});

Function Type Literals

Function Type Literals 是另一种声明函数类型的方法。 它们通常用于高阶函数的签名,即接受函数作为参数或返回函数的函数:

interface Array<T> {
  sort(compareFn?: (a: T, b: T) => number): this;
  // ...
}

也许令人惊讶的是,在函数类型文字中总是需要参数名称。 您不能省略参数名称而只指定类型。

如果忘记指定形参名称,我们将无法得到期望的类型定义。下面的代码是一个例子:

我们本意想定义一个拥有两个输入参数,一个返回参数的函数类型,输入参数类型分别为 string 和 number.

type FunctionType2 = (string, number) => number;
// (string: any, number: any) => number

实际上,TypeScript 编译器将 string 和 number 理解成了形式参数名,且类型为 any. 这就和我们的期望不一致了。

总结一下:

Object Type Literals with Call or Construct Signatures

在 JavaScript 中,函数只不过是可以调用的特殊对象。 这个事实反映在对象类型文字的语法中:它们描述了对象的形状,它也恰好有一个调用签名:

interface RegExpConstructor {
  // Call signatures
  (pattern: RegExp): RegExp;
  (pattern: string, flags?: string): RegExp;

  // ...
}

与调用签名类似,对象类型文字也可以包含构造签名,在这种情况下,它被称为构造函数类型。 当使用 new 运算符调用函数时,函数的构造签名定义了它的参数列表和返回类型。 构造签名看起来与调用签名几乎相同,除了它们额外带有 new 关键字前缀:

interface RegExpConstructor {
  // Call signatures
  (pattern: RegExp): RegExp;
  (pattern: string, flags?: string): RegExp;

  // Construct signatures
  new (pattern: RegExp): RegExp;
  new (pattern: string, flags?: string): RegExp;

  // ...
}
// Using the call signature
const digitsPattern1 = RegExp("^\\d+$");

// Using the construct signature
const digitsPattern2 = new RegExp("^\\d+$");

更多Jerry的原创文章,尽在:"汪子熙":


相关文章

  • TypeScript 定义函数的几种写法

    参考链接1[https://www.typescriptlang.org/docs/handbook/2/func...

  • 2018-09-19

    JavaScript函数的几种写法 1. 常规写法: 最常规的写法 // 函数的定义function foo(){...

  • 通俗易懂TypeScript系列四:函数(上)

    1、函数定义 在TypeScript中函数的定义中跟JavaScript一样,都支持函数声明和函数表达式写法 1、...

  • react一些些

    1.react component有几种写法?各有什么特点 ① 函数式定义的无状态组件(Stateless Fun...

  • typescript函数

    typescript函数的隐式定义 在typescript中的函数并不需要刻意去定义,比如我们实现一个加法函数: ...

  • typescript语法

    参考:typescript参考1 typescript参考2 函数参数类型定义 声明函数参数默认值 ...

  • TypeScript 函数

    TypeScript 函数 函数类型 为函数定义类型 使用这种方式,为函数定义返回的类型 书写函数类型 书写函数类...

  • TypeScript 学习笔记3 函数

    1.函数定义 1.1 js 函数定义 1.2 ts 函数定义 2.函数重载 Typescript从0到1-学习视频...

  • TypeScript定义函数

    设置可选参数 设置默认参数 设置不确定参数 定义泛型函数

  • TypeScript学习-- 函数(1)

    TypeScript 函数(1) tsc greeter.ts 函数类型 为函数定义类型 书写完整函数类型 函数...

网友评论

      本文标题:TypeScript 定义函数的几种写法

      本文链接:https://www.haomeiwen.com/subject/vgabyltx.html