Javascript 即使参数的类型错误,TypeScript也不会声明错误

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[

我有一个函数,它将字典作为第一个参数。此词典以字符串作为键,函数作为值。问题是,如果字典中的函数有一个错误的签名,TypeScript不会抱怨

一段代码值1000个字。这是我的
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应该关注的问题。