如何处理 TypeScript class 的选项参数中的默认可选字段,同时让用户选择提供的参数?

How to handle defaulted optional fields in an options parameter for a TypeScript class whilst letting user chose provided arguments?

我正在尝试确定如何处理 TypeScript class 的选项参数中的可选字段,同时仅要求 class 的用户仅提供他们需要的参数,以便所有其他选项是默认的(用例允许用户通过选项自定义 class)

例如,如果有一个 class(例如,Logger)接受一个选项参数(例如,IOptions),其中所有选项都是可选的,并且将在构造函数。然后所有 IOptions 字段都可以为空,因此用户只需提供他们需要的参数(例如,自定义 Logger)。这很好,因为所有可为空的值都将在构造函数中默认设置,但是,如果在整个 class 中使用选项参数,编译器将出错,因为字段在 IOptions 中被标记为可为空。然而,构造函数默认了所有选项,所以它们应该是安全的,但为了避免错误,要么使用重复的空断言(例如,this.options.logTag!!),要么重复默认(例如,this.options.logTag ?? 'NONE),两者这些避免错误的尝试并不理想

请解释如何使用默认选项对象,同时只要求用户提供他们需要的字段?

还请分享任何可能有助于回答此问题的资源。

示例 Logger class:

interface IOptions {
    logTag?: string;
    // ...
}

class Logger {
    private options: IOptions; // Assume options are always contained & accessed from this object.

    constructor(options: IOptions = {}) {
        this.options = {
            ...options,
            logTag: options.logTag ?? 'NONE',
            // ...
        }
    }

    private saveTag(tag: string, message: string) { // Example demonstrating requiring non-null option value (logTag could be used directly, but passed here for example).
        // ... (e.g., formatting, saving, etc.)
    }

    log(message: string) {
        this.saveTag(this.options.logTag); // ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.

        // ...
    }

}

const logger = new Logger();
logger.log('message');

根据@jonrsharpe 对 Partial 的建议,我发现 Required 通过让用户提供任何可选字段同时避免可能为空选项的错误而不使用重复的空断言来解决问题或重复违约:

private options: Required<IChangeloggerOptions>;

这意味着 IChangeloggerOptions 的字段都可以为空,而 class 中的选项都是必需的(这些选项不会出错,因为它们在构造函数中都是默认的)