打字稿真的不检查函数类型吗?

Jam*_*Lee 1 typescript

给出下面的代码,输入脚本编译器不会引发任何错误,所以它只是不检查函数的参数类型?

var mySearch3:  (source: Person, subString: string)=> boolean  = 
       function()     {return true;}
Run Code Online (Sandbox Code Playgroud)

Fen*_*ton 5

TypeScript 尊重您可以忽略传递的参数这一事实。

当您定义了一个函数时,任何实现都必须通过具有正确类型的参数或省略该参数来兼容。

调用函数时,您必须提供所有必需的参数(非可选且没有默认值的参数)。

让我们使用此接口来处理一些示例,该接口用于接受字符串和数字的函数:

interface Example {
    (name: string, age: number) : string;
}
Run Code Online (Sandbox Code Playgroud)

以下所有功能均兼容:

var a: Example = function() { return 'Hello'; };
var b: Example = function(name: string) { return 'Hello ' + name; };
var c: Example = function(n: string, a: number) { return 'Hello ' + n + ' you are ' + a; };
Run Code Online (Sandbox Code Playgroud)

每一个都是兼容的,因为它要么指定了正确类型的参数,要么省略了它。关键是它们都必须以相同的方式调用

我在调用这些函数时必须指定这两个参数,即使它们不使用它们。这允许函数更改其实现,而不会影响依赖公共契约(期望传递两个参数)的调用者。

a('Rod', 50);
b('Jane', 50);
c('Freddy', 50);
Run Code Online (Sandbox Code Playgroud)

现在让我们看看错误案例。

职能:

// The parameters are not compatible.
var d: Example = function(special: boolean) { return 'Hello';}
Run Code Online (Sandbox Code Playgroud)

函数调用:

// You haven't passed the args
a();
a('Rod');

// Args are wrong type
a(50, 'Rod');
a('Rod', true);

// Too many args
a('Rod', 50, true);
Run Code Online (Sandbox Code Playgroud)