typescript可选参数类型检查

时间:2017-03-28 11:58:23

标签: typescript

我在类(MyClass)上有一个带有可选参数的函数(func)。可选参数(MyInterface)的类型只有可选属性。

当我使用类似数字的原语调用foo时,我预计会出现编译器错误。但事实并非如此。为什么会那样?有没有办法告诉类型系统将其标记为错误?

interface MyInterface {
    foo?: string
}

class MyClass {
    func(b?: MyInterface) : void {}
}

let c = new MyClass();
c.func();
c.func({ foo: 'bar' });
c.func({ foo: 30 });       // compiler error: OK
c.func({});
c.func(60);                // No compiler error: Not what I expect

2 个答案:

答案 0 :(得分:2)

发生这种情况的原因是import Foundation var sampleString:String? print(sampleString ?? "Nil") if sampleString != nil{ print(sampleString) } else{ print("Nil") } number兼容。 (例如,假设类型{}的参数也与{toFixed: (n: number) => string}兼容)。

您也可以这样思考:您可以使用number 对数字执行任何操作。

答案 1 :(得分:0)

让我们介绍一些脏的console.log-debugging:

interface MyInterface {
    foo?: string
}

class MyClass {
    func(b?: MyInterface): void {
        console.log(`b:${b}`);
        if (b != undefined) {
            console.log(`b.foo:${b.foo}`);
        }
    }
}

let c = new MyClass();
c.func();
c.func({ foo: 'bar' });
c.func({ foo: 30 });       // compiler error: OK
c.func({});
c.func(60);                // No compiler error: Not what I expect

结果是:

b:undefined

b:[object Object]
b.foo:bar

b:[object Object]
b.foo:30

b:[object Object]
b.foo:undefined

b:60
b.foo:undefined

让我们关注最后两个结果。

MyInterface只有foo参数,而且是可选的。所以实际上任何类型都是MyInterface。这就是参数b的值为60的原因。b在这种情况下类型MyInterface没有可选的foo成员。

如果从foo成员中删除可选运算符,则编译器将抛出异常。如果您向MyInterface添加其他非可选参数,它也会这样做。

也许这似乎违反直觉,但事实并非如此。在您提供的表单中,MyInterface没有定义任何内容。您要求编译器保护输入以获得foo参数...或者没有它。那么为什么要检查输入是否为object