打字稿真的不检查函数类型吗?
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 以及应该传递给它的参数是什么。
给出下面的代码,类型脚本编译器不会引发任何错误,所以它只是不检查函数的参数类型?
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 以及应该传递给它的参数是什么。