【问题标题】:TypeScript does not enforce type check for function argumentsTypeScript 不强制对函数参数进行类型检查
【发布时间】:2013-08-19 03:44:02
【问题描述】:

我的印象是 TypeScript 允许您采用有效的 JavaScript 程序并通过使一些关键符号类型安全来“强制”类型。这将通过所有用法传播类型,并使您更新所有符号引用。

这似乎是不正确的。在以下示例中,makeDiv 函数调用了类型化的 make 函数,而不检查参数类型。

// strongly typed arguments
function make(tagName: string, className: string) {
    alert ("Make: " + className.length);
}

// no typing
function makeDiv(className) {
    // calling the typed function without type checking
    return make("div", className);
}

makeDiv("test"); 
makeDiv(6); // bang!

我在这里错过了什么吗?有没有办法强制执行“更严格”的类型检查?还是这是 TypeScript 创作者做出的设计决定?

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    这是一个设计决定。任何没有显式类型化的东西都会被隐式类型化为any 类型。 any所有 类型兼容。

    var x:any = 123;
    x = "bang";
    

    为了防止 隐式 将变量键入为 any,从 TypeScript 0.9.1 开始有一个编译器标志 (--noImplicitAny)

    如果您使用此选项进行编译,您的代码将无法编译 除非您这样做:

    // You need to explicitly mention when you want something to be of any type. 
    function makeDiv(className:any) {
        // calling the typed function without type checking
        return make("div", className);
    }
    

    【讨论】:

    • 谢谢@basarat。我不明白的是any 以两种方式与所有类型(如您所指出的)兼容。我在心理上将它与 C# 对象相关联,该对象可以从字符串向下转换,但不能反过来。
    • 实际上,如果可能,任何未显式键入的内容都会推断出类型。例如。 var x = 3 变成一个数字,function a() { alert('abc') } 返回 void。出于某种原因,您可以返回 a() 从另一个函数返回的 void 值,即 function b() { return a() }b() 暗示返回 void
    猜你喜欢
    • 2020-05-12
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2023-03-08
    相关资源
    最近更新 更多