簡體   English   中英

typescript中class的可選參數

[英]Optional parameter of class in typescript

給出以下代碼:

class ConnectionOptions
{
    host: string = "localhost";
    port: number = 5672;
    username: string = "guest";
    password: string = "guest";
}

class ConnectorClass
{
    options: ConnectionOptions = new ConnectionOptions();

    SetOptions(options: ConnectionOptions)
    {
        console.log(options);
        this.options = options;
    }
}

// Adopt singleton pattern
var Connector = (function () {
    var instance : ConnectorClass;

    function createInstance() {
        return new ConnectorClass();
    }
 
    return {
        I: function () : ConnectorClass {
            if (!instance) {
                instance = createInstance();
            }
            return instance;
        }
    };
})();

// TestApp
Connector.I().SetOptions({ 'host': "192.168.17.5" });

在最后一行有以下 typescript 錯誤:

index.ts:50:26 - error TS2345: Argument of type '{ host: string; }' is not assignable to parameter of type 'ConnectionOptions'.
  Type '{ host: string; }' is missing the following properties from type 'ConnectionOptions': port, username, password

50 Connector.I().SetOptions({ 'host': "192.168.17.5" });

我明白為什么會拋出錯誤:TS 期望有 4 個屬性,但我只想設置其中的 1 個,這在 Typescript 中不可能嗎?

對於您的代碼,接口似乎比 class 更合適。 如果需要,您有幾個實現接口的類。 然后,如果您希望某些 arguments 是可選的,您可以使用可選修飾符 ( ? ):

interface ConnectionOptions {
    host?: string;
    port?: number;
    username?: string;
    password?: string;
}

const DefaultConnectionOptions: ConnectionOptions = {
  host: 'localhost',
  port: 5672,
  username: 'guest',
  password: 'guest',
}

現在您的SetOptions方法可能如下所示:

    options: ConnectionOptions = DefaultConnectionOptions;

    SetOptions(options: ConnectionOptions) {
        console.log(options);
        this.options = { ...DefaultConnectionOptions, ...options };
    }

您的呼叫Connector.I().SetOptions({ 'host': "192.168.17.5" }); 現在應該可以工作,因為沒有屬性是強制性的。


您可能希望所有連接選項都是強制性的,但在調用SetOptions時它們不是強制性的。 在這種情況下,不要在屬性上使用可選修飾符。 將您的SetOptions簽名更改為使用Partial<T>

    SetOptions(options: Partial<ConnectionOptions>) {
        console.log(options);
        this.options = { ...DefaultConnectionOptions, ...options };
    }

以上仍將強制this.options具有每個屬性,但參數options不必提供所有屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM