gpt4 book ai didi

typescript - 断言接口(interface)中的可选属性在编译时在类中不为空

转载 作者:搜寻专家 更新时间:2023-10-30 20:57:14 26 4
gpt4 key购买 nike

在 Javascript 中,我喜欢将 options 对象 传递给 constructor,并使用默认值填充我期望的任何缺失的属性:

function foo(options) {
if(options.a == undefined) {
options.a = 1;
}
if(options.b == undefined) {
options.b = 'hello';
}
this.options = options;
}

new foo({a: 10});

尝试在 Typescript 中实现这个模式,我有:

interface Options {
a?: number;
b?: string;
}

class Foo {
options: Options;
constructor(options: Options) {
if(options.a == undefined) {
options.a = 1;
}
if(options.b == undefined) {
options.b = 'hello';
}
this.options = options;
}
}

当我稍后在 class 中使用 options 时,我知道所有的属性都已定义。但是,Typescript 并不知道这一点,因此该语句会产生错误:

let a:Number = this.options.a; // Argument of type 'number | undefined' is not assignable to parameter of type number.

此外,我不想让 class 中的代码稍后将 nullundefined 值分配给属性:

this.options.a = undefined; // should produce compiler error

有没有办法定义我的类型,所以 Options 的属性在 class 中使用时不能为 null 而无需定义两个 Options 接口(interface)?

例如,我知道我可以制作另一个供内部使用的接口(interface):

interface OptionsSafe {
a: number;
b: string;
}

// in Foo constructor
this.options = {
a: a != undefined ? options.a! : 1,
b: b != undefined ? options.b! : 'hello'
};

但是我需要在两个单独的接口(interface)中定义选项的属性,并确保它们始终同步(如果 Typescript 可以从一个定义生成两个接口(interface),这个解决方案会很棒)。

我也不想将所有属性作为单独的可选参数传递,因为

  1. 可以有几十个或更多选项,
  2. 函数参数可能会偏离 Options 界面,因此我仍然必须保持两个“界面”同步。

最佳答案

一种选择是使用内置的 Partial Typescript 提供的类型。这可能太接近于为您“定义两个 Options 接口(interface)”,但无论如何我都会告诉您我的意思。

Typescript 提供了一个内置类型 Partial定义为 type Partial<T> = {[P in keyof T]?: T[P]} .

这意味着您可以只定义 Options与所有成员接口(interface),但将它的部分版本用于构造函数。像这样:

interface Options {
a: number;
b: string;
}

class Foo {
options: Options;
constructor(options: Partial<Options>) {
const defaultOptions = {
a: 1,
b: 'hello'
};

this.options = Object.assign(defaultOptions, options);
}
}

为了让 Typescript 正确推断您已获得对象的所有必要属性,您需要远离 if您使用的语句逻辑更像上面的内容。

关于typescript - 断言接口(interface)中的可选属性在编译时在类中不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com