簡體   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