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

Typescript don't really check function type?

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

var mySearch3:  (source: Person, subString: string)=> boolean  = 
       function()     {return true;}

Typescript 确实会检查函数类型 - 这只是 Typescript 让您忽略赋值中的函数参数的一种奇怪的特殊情况。

如果您将变量声明与赋值分开,您将在赋值过程中遇到类型错误,例如

var mySearch3 :(source: number, subString: string) => boolean;
var mySearch3 = function() { return true; }

将在 tsc 1.4.1 中产生此错误:

error TS2403: Subsequent variable declarations must have the same type.  
Variable 'mySearch3' must be of type 
'(source: number, subString: string) => boolean', 
but here has type '() => boolean'.

同样,如果您提供参数,您会收到错误消息,但它们与函数定义的类型不同。例如

var mySearch3 :(source: number, subString: string) => boolean =
    function(source:string, subString:string) { return true; }

会给你这个错误:

error TS2322: Type '(source: string, subString: string) => boolean' is
not assignable to type '(source: number, subString: string) => boolean'.
Types of parameters 'source' and 'source' are incompatible.
Type 'string' is not assignable to type 'number'.

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

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

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

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

interface Example {
    (name: string, age: number) : string;
}

以下所有功能都兼容:

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; };

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

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

a('Rod', 50);
b('Jane', 50);
c('Freddy', 50);

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

函数:

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

函数调用:

// 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);

Type 在此处验证需要使用所有必需参数调用函数。参数较少的实现符合需要,只是不要全部使用。如果这样的检查有效,那么你可以用三个参数来做函数,并且只是欺骗类型系统:

const mySearch3:  (source: Person, subString: string)=> boolean = (_source, _subString) => true 

如您所见,此函数未使用其中任何一个。我想证明的是——这种类型检查没有实际意义,因为你无法验证参数是否真的在实现中使用。对于调用者来说重要的是 -> 函数是什么类型 returns 以及应该传递给它的参数是什么。