typescript:强制执行严格的类型检查

时间:2014-03-17 18:05:26

标签: typescript

请参阅代码here

interface IBar {
    search:(any) => void;
}

class test{
    search:(id:string) => void;
    constructor(b:IBar){
        this.search = (id) => this.searchImp(b, id);
    }

    private searchImp (b, id) {
              b.unknownFn(id);
    }
}

使用b.unknownFn(id)不会出现任何错误。这可能是因为函数内的b属于any类型。仍然,为什么打字稿编译器不能推断出,我在调用中传递了bIBar

this.search = (id) => this.searchImp(b, id);

是否可以使用任何javascript与typescript一起工作?

我正在将一个JS应用移植到打字稿上。反正是为了让编译器检测到这些错误(在编码期间我可能不想输入注释所有函数参数,至少最初是因为我只是复制代码),所以我可以在编译期间纠正。使用noImplicitAny检测到我使用了any,为什么不能根据传递的类型检测到错误?

4 个答案:

答案 0 :(得分:0)

private searchImp (b:IBar, id) {
          b.unknownFn(id);
}

这应该是红线,除非你为你的函数指定参数的类型,我相信它会被视为any

Updated code

答案 1 :(得分:0)

您的searchImp声明没有任何参数类型注释只是

的简写
private searchImp (b : any, id : any) {
          b.unknownFn(id);
}

所以你说这个方法接受b的任何东西。没有进一步的检查适用于any类型的任何内容。

您可能想到的是没有类型注释的函数的某种形式的类型推断。但这不是TypeScript的工作方式 - 没有推理,只有隐式类型any

答案 2 :(得分:0)

根据使用情况,不会发生TypeScript类型推断。它基于声明。例如。 fooarg都是。但是bar接受1个参数并且返回什么都不是从声明中推断出来的。

// declaration
var foo; 
// usage 
foo = 123;
foo = 'asdf';


// declaration
function bar(arg){}
// usage 
bar(123);
bar('asdf');

答案 3 :(得分:0)

在我看来,你没有取消选中该框"允许隐含的'任何'类型"在Typescript选项卡下的项目属性中。这甚至可以在做Andreas建议之前给你带来红色曲线(添加显式参数类型)。