【问题标题】:TypeScript claims no error even if parameter has the wrong type即使参数的类型错误,TypeScript 也不会出错
【发布时间】:2020-03-27 05:09:17
【问题描述】:

我有一个将字典作为第一个参数的函数。这个字典有字符串作为键,函数作为值。问题是,如果字典中的函数签名错误,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 --version 打印 Version 3.7.2。我有两个问题:

  1. 为什么我没有收到任何错误消息?
  2. 我是否遗漏了一些会导致出现此错误的编译标志?

任何见解将不胜感激。谢谢!

【问题讨论】:

    标签: javascript typescript return-type tsc


    【解决方案1】:

    没有问题,因为(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 
    

    这个事实对于程序流程来说是完全没问题的。如果你的界面说 - 我需要一个不返回的函数,那么如果我传递一个返回某些东西的函数,它完全没问题,因为我永远不会使用这个返回数据。它是类型安全的,无需担心。

    有关功能可分配性的更多详细信息 - Comparing two functions。还有更多关于 TypeScript 类型行为和关系的详细信息 - types assignability

    【讨论】:

    • 太棒了,这解释了很多。但是,function g(): void {return 1;} 仍然失败。它如何与“如果我传递一个返回某些东西的函数,它完全没问题,因为我永远不会使用这个返回数据”的解释一起工作?
    • 这是不同的事情,如果你声明函数返回void,那么它应该返回void(所以没有返回)。这与可分配性无关。您只需声明不同的类型,然后您就真的返回了。所以在这个例子中 TS 应该阻止你。
    • @enanone 导致如果您键入 one 函数以明确不返回某些内容,如果它返回的内容可能是错误的。
    • @enanone 这些是不同的东西,第一个是当需要 X 时你可以传递什么,第二个是声明和实现接口。
    • 如果你不假设任何返回类型,那么你将不会使用它,所以当你传递一个返回的函数时程序是安全的。但是当你声明你的函数返回 X,但你的函数返回真正的 Y 时,这是 TS 应该抓住的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多