![](/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.