![](/img/trans.png)
[英]typescript : type check optional parameter in a Function passed as arguments
[英]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.