有没有办法阻止/检测TypeScript中'any'的隐式赋值?

时间:2015-03-23 16:11:06

标签: typescript

在TypeScript中,我发现有时候我必须使用' any'处理解析的JSON数据时键入。不幸的是,这使得忽略类型约束变得容易,因为TypeScript允许来自' any'的隐式转换。类型。

var obj = JSON.parse('{ "num": "this is a string", "str": 3 }');

var num: number = obj.num;  // num = "this is a string"!
var str: string = obj.str;  // str = 3!

我正在寻找一种方法来检测何时发生这种情况并需要进行某种显式转换。

var num: number = obj.num;          // Error
var num: number = <number>obj.num;  // Ok

然后我可以使用一些验证函数进行扩展,以确保在运行时类型是正确的。

function toNumberChecked(val: any): number {
    if (!_.isNumber(val)) throw Error('Value is not of type "number"');
    return <number>val;
}

var num: number = toNumberChecked(obj.num);

有什么方法可以检测到这种情况,以帮助防止错误通过?如果不是通过TypeScript编译器本身,那么可能通过某种单独的工具?

2 个答案:

答案 0 :(得分:0)

实现此目标的最简单方法是将any替换为{}来更改您正在使用的.d.ts文件。来自{}的所有类型断言都成功,但它不能分配给任何有成员的类型。

function otherJSON(s: string): {} {
    // ...
    return undefined;
}

var x: number = otherJSON('3'); // Error
var y: number = <number>otherJSON('3'); // OK

答案 1 :(得分:0)

Typescript会在编译时抛出错误。在编译时,它没有关于解析的JSON的属性的信息。这就是您目前没有收到任何错误的原因。

您有两种选择:

  1. 如果您确定属性的类型,您可以编写一个界面。 (我已经改变了数字和字符串的匹配,因此它更具可读性。)

    interface JSONResult{
        num:number;
        str:string;
    }
    var result:JSONResult = JSON.parse('{ "str": "this is a string", "num": 3 }');
    var x:number = result.num;
    var y:number = result.str; // error
    
  2. 如果您不控制JSON,则需要进行运行时验证。例如,如果您通过http。

  3. 收到JSON,就会出现这种情况