Javascript 即使参数的类型错误,TypeScript也不会声明错误
我有一个函数,它将字典作为第一个参数。此词典以字符串作为键,函数作为值。问题是,如果字典中的函数有一个错误的签名,TypeScript不会抱怨 一段代码值1000个字。这是我的Javascript 即使参数的类型错误,TypeScript也不会声明错误,javascript,typescript,return-type,tsc,Javascript,Typescript,Return Type,Tsc,我有一个函数,它将字典作为第一个参数。此词典以字符串作为键,函数作为值。问题是,如果字典中的函数有一个错误的签名,TypeScript不会抱怨 一段代码值1000个字。这是我的main.ts: interface MyMap { [key: string]: (x: number) => void; } function f(map: MyMap, key: string, x: number) : void{ map.hasOwnProperty(key) ? map[
main.ts
:
interface MyMap {
[key: string]: (x: number) => void;
}
function f(map: MyMap, key: string, x: number) : void{
map.hasOwnProperty(key) ? map[key](x) : console.log(x)
}
const stupidMap: MyMap = {
'square': (x) => {
console.log(x*x);
return x*x; // This function should return void!!
},
'double': (x) => {
console.log(x+x);
}
}
f(stupidMap, 'square', 5) // Prints 25
f(stupidMap, 'double', 5) // Prints 10
我用tsc main.ts编译它,没有任何错误<代码>tsc--版本打印3.7.2版
。我有两个问题:
如有任何见解,将不胜感激。谢谢 没有问题,因为
(x:number)=>void
可分配给(x:number)=>number
。这是一个证明:
type F = (x: number) => void
type Z = (x: number) => number
type ZextendsF = Z extends F ? true : false // evaluate to true
这个事实对于程序流来说是完全正确的。如果你的界面上说-我需要一个不返回的函数,那么如果我传递一个返回某个东西的函数,它完全可以,因为我永远不会使用这个返回数据。它是类型安全的,无需担心
有关函数可分配性的更多详细信息-。还有更多关于类型脚本类型、行为和关系的详细信息-。令人惊讶的是,这解释了很多。但是,
函数g():void{return 1;}
仍然失败。它是如何与“如果我传递一个返回某些内容的函数,它完全可以,因为我永远不会使用这个返回数据”的解释一起工作的?这是不同的事情,如果你声明函数返回void
,那么它应该返回void
(所以没有返回)。这与可转让性无关。您只需声明不同的类型,然后就可以返回。所以在本例中,TS应该阻止您。@一个原因是,如果您键入一个函数显式不返回某些内容,如果它返回的内容可能是错误的。@一个原因是不同的,第一个是当需要X时可以传递的内容,第二个原因只是声明和实现接口。如果您不采用任何返回类型,然后您将不使用它,因此当您传递返回的函数时,程序是安全的。但是当你声明你的函数返回X,但是你的函数返回Y时,这是TS应该关注的问题。