【问题标题】:Why defining the function type in typescript has two ways of doing it?为什么在 typescript 中定义函数类型有两种方法呢?
【发布时间】:2019-11-03 19:31:43
【问题描述】:

两者有什么区别?

在做:

一)

let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };

就这样做:

B)

let myAdd = function(x: number, y: number): number { return x + y; };

我从打字稿documentation 中获取了这个。为什么 sn -p A 中的代码有用?我只是在其中看到了一些冗余,就像在 sn-p B 中所做的那样,输入了参数并且输入了返回值。

我的印象是,在 sn-p A 中,参数的输入和结果值被完成了两次。

我不明白为什么 A 不同于 B 或者为什么 AB 更有用

【问题讨论】:

  • 它没有区别,因为被推断的类型是完全相同的。确保它符合特定的签名而不是像本例那样的内联类型通常很有用。

标签: typescript


【解决方案1】:

这两个例子没有区别。在这两种情况下,myAdd 具有相同的类型 (x: number, y: number) => number

文档中的示例只是关于如何编写函数类型。在此示例中,指定类型并不是特别有用,但您可以对类型执行其他操作。你可以把它放在一个类型别名中并重用它:

type MyOp = (x: number, y: number) => number;
let myAdd: MyOp = function (x: number, y: number): number { return x + y; };
let mySubtract: MyOp  = function (x: number, y: number): number { return x - y; };

你也不能在声明时初始化函数:

let myOp: (x: number, y: number) => number;
declare let condition: boolean;

if (condition) {
    myOp = function (x: number, y: number): number { return x + y; };
} else {
    myOp = function (x: number, y: number): number { return x - y; };
}

另外,当你有一个函数类型时,你不需要指定参数类型:

let myOp: (x: number, y: number) => number = function (x, y) { return x + y;}

【讨论】:

    【解决方案2】:

    'A' 代码 sn-p 基本上用于为 myAdd 函数创建一个类型。如果您在没有类型的情况下定义 myAdd 函数,则可以在之后重新分配给任何值或数据类型。也许您希望 myAdd 接受两个数字参数并返回一个数字。但是如果你不指定一个类型,那么你可能会不小心把它指定给别的东西。

    【讨论】:

    • 如果我尝试使用示例中的两个不同函数为我分配的变量分配不同的类型,例如如果我尝试分配一个布尔值:Type 'true' is not assignable to type 'number',我会得到完全相同的错误。所以如果我同样使用sn-p A或B中的函数,则推断返回类型的类型。
    • 我想你不明白我的意思。我说的是重新分配函数本身。例如:–let myAdd: (x: number, y: number) => number; myAdd = true; //Type 'true' is not assignable to type '(x: number, y: number) => number'.
    • 哦,你是对的,我没看懂,但是如果你尝试在sn -p B中重新赋值变量也会抛出同样的错误,例如如果我将绑定分配给布尔值。有关信息,这是我的 tsconfig 选项:` "compilerOptions": { "jsx": "react", "esModuleInterop": true, "lib": ["es6", "dom", "es2017"], "strictNullChecks" :真,“strictFunctionTypes”:真}`
    • 使用代码 sn -p 'A' 将为 myAdd 变量创建一个类型。因此,如果您将其重新分配给不同的类型。它会给出一个错误。 let myAdd: any = function(x: number, y: number): number { return x + y; };myAdd = true // works fine since the type of myAdd is any. 使用代码 sn-p 'B' 将使 Typescript 从分配的值推断类型。在您的情况下,一个接受 2 个数字参数并返回一个数字的函数,如果您将重新分配给不同的类型,它将给出错误。
    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 2011-06-27
    • 2019-01-03
    • 2021-12-25
    • 2015-10-06
    • 2014-04-20
    • 2015-06-05
    相关资源
    最近更新 更多