繁体   English   中英

typescript可选参数类型检查

[英]typescript optional parameter type check

我在类(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

发生这种情况的原因是number{}兼容。 (例如,想象一下{toFixed: (n: number) => string}类型的参数,它也与number兼容)。

您也可以这样思考: 您可以使用{foo?: string}对数字执行任何操作

我们来介绍一些脏的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM