打字稿不是真的检查功能类型?

时间:2015-01-31 14:43:39

标签: typescript

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

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'.

答案 2 :(得分:0)

Type在此处验证是否需要使用所有必需的参数来调用函数。参数较少的实现满足需求,只是不要全部使用它们。如果这样的检查有效,那么您可以使用三个参数来执行功能,并欺骗类型系统:

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

如您所见,此功能未使用任何功能。我想证明的是-这种类型检查没有实际意义,因为您无法验证该参数是否在实现中真正使用。对于调用者而言,重要的是->函数返回的类型是什么,应将什么参数传递给它。