2015-09-25 85 views
1

为什么在这段代码中没有任何编译错误? 代码:Typescript:为什么没有参数的函数可以强制转换为参数

function partial(f: (a: string) => string, a: string) : string { 
    return ""; 
} 

var test =() => ""; 
var result = partial(test, ""); 

功能“部分”需要作为第一个参数的函数,这需要一个参数,但我传递给它的功能,不带任何参数,打字稿编译器认为,这是好。我明白这不能破坏任何东西,因为你可以将世界中的所有参数传递给不需要的函数,它不会破坏任何东西,但它应该是编译错误,因为typescript是关于类型的,是一个明显的类型错配,它可能是一个开发人员的错误。

是否有解决此问题的任何解决方法?

+1

也许我错过了一个术语步骤或什么(我不是一个打字稿用户),但不会有一个函数与参数和功能,但仍然都是功能?为什么会抛出一个类型错误?他们都是同一类型。 –

回答

2

有一个明显的类型错配,它可能是一个开发人员的错误。

这段代码没有什么明显的错误。考虑这样的事情:

let items = [1, 2, 3]; 
// Print each item in the array 
items.forEach(item => console.log(item)); 

此编码是否正确?非也!但forEach调用其提供的功能与三个参数,而不是一个。这将是乏味有写:

items.forEach((item, unused1, unused2) => console.log(item)); 

请注意,如果你试图做一些事情,实际上是错误的,你仍然可以得到错误。例如:

function printNumber(x: number) { console.log(x); } 
let strings = ['hello', 'world']; 
strings.forEach(printNumber); // Error, can't convert string to number 
+0

嗯,我不同意这一点。如果你有一个函数可能需要1个参数,有些重载可能需要2或3个参数,你应该为所有原型创建类型。我认为没有区别。 对于你的例子,如果Array上的forEach方法可以作为第一个arg函数,它需要一个参数,两个参数或三个参数,你应该在类型中创建3个原型来显示这三种可能性。 –

+1

这不会模拟任何函数的运行时行为。 'forEach' *总是*用三个参数调用它的参数;它不会检查回调的长度以决定使用多少个参数来调用它。 –

相关问题