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