在TypeScript中创建一个自定义类型的对象。

9 浏览
0 Comments

在TypeScript中创建一个自定义类型的对象。

我在TypeScript中有以下接口:

interface IX {
    a: string,
    b: any,
    c: AnotherType
}

我声明了一个该类型的变量,并初始化了所有属性:

let x: IX = {
    a: 'abc',
    b: null,
    c: null
}

然后我在稍后的初始化函数中给它们赋予真实的值:

x.a = 'xyz'
x.b = 123
x.c = new AnotherType()

但是我不喜欢在声明对象时为每个属性指定一堆默认的null值,因为它们将在稍后被设置为真实的值。我能告诉接口将我没有提供的属性默认为null吗?这样做会让我能够这样写:

let x: IX = {
    a: 'abc'
}

而不会得到编译器错误。现在它告诉我:

TS2322: 类型“{}”的值不能赋给类型“IX”。在类型“{}”中缺少属性“b”。

0
0 Comments

问题的出现的原因:在TypeScript中,无法为接口或类型别名提供默认值,因为它们仅在编译时存在,而默认值需要运行时支持。

解决方法:虽然无法为接口或类型别名提供默认值,但在JavaScript运行时,未指定的值默认为undefined。因此,可以将它们标记为可选的。通过将属性标记为可选,可以在创建对象时只提供需要的属性,并在需要时提供其它值。

使用以上方法,可以解决问题,避免了在定义默认值时的冗余代码。同时避免了使用any类型,从而更好地发挥了TypeScript的优势。

以上是Stack Overflow上对该的问题和解答。一些回答提供了其他解决方法,但也指出了它们的缺点。有些回答提到可以使用泛型来解决类似的问题,提供了相关的链接供参考。

至于为什么无法在编译时插入默认值,以及是否真的需要运行时支持,目前还没有得到明确的解释。但有人提出,编译器在类型实例化时可以发出默认值,从而避免了运行时支持的需求。

总之,通过将属性标记为可选并在需要时提供值,可以在TypeScript中创建自定义类型的对象。

0
0 Comments

在TypeScript中,接口是用来定义自定义类型的规范。然而,接口并不支持设置默认值。但是,我们可以通过使用可选属性来实现类似的功能。当我们需要创建一个自定义类型的对象时,可以使用可选属性来指定一些属性的默认值。

在上述问题中,提出了如何在接口中设置默认值的问题。通过将接口的属性改为可选属性,我们可以实现这个需求。例如,将接口改为以下形式:

interface IX {
    a: string,
    b?: any,
    c?: AnotherType
}

然后,我们可以创建一个对象并指定其中的必需属性,如下所示:

let x: IX = {
    a: 'abc'
}

如果需要给`x.b`和`x.c`赋予默认值,可以在初始化函数中进行判断和赋值操作。

然而,在问题中要求将`x.b`和`x.c`初始化为`null`。但是,当我们使用`let x = {a: 'abc'}`来创建对象时,`x.b`和`x.c`的值将是`undefined`,而不是`null`。因此,上述解决方法并不完全满足需求,尽管是一种聪明的快速修复方法。

同样的问题也存在于被接受的答案中。下面是一个更好的解决方法:

如果`x`是一个具有默认值的对象,那么创建最终实例对象时,可以使用`Object.assign`方法来赋予`x.b`和`x.c`默认值,如下所示:

let a: IX = Object.assign({b: true}, x);

这种方法的缺点是,`b`和`c`属性在实例对象中仍然是可选的,这可能不是我们想要的。

为了解决接口中无法设置默认值的问题,可以提供一个工厂方法来初始化接口的实例对象。这样,我们可以通过调用该工厂方法来创建一个具有默认值的对象。

最后,问题还问到了如何检查可选属性是否已经被设置。在TypeScript中,可以使用`in`运算符来判断一个属性是否存在于对象中。例如,可以使用以下代码来检查`x.b`是否已经设置:

if ('b' in x) {
    // x.b已经被设置
}

总之,尽管在TypeScript的接口中无法直接设置默认值,但我们可以通过使用可选属性、工厂方法和条件判断来实现类似的功能。这些方法可以帮助我们在创建自定义类型的对象时,提供一些属性的默认值,并且可以检查可选属性是否已经被设置。

0
0 Comments

问题的出现原因是:需要在typescript中创建一个自定义类型的对象,并且希望能够设置默认值。

解决方法是:定义一个包含默认值的选项接口和相应的常量,然后在构造函数中使用扩展运算符来设置options成员变量。可以使用Partial类型来声明构造函数的参数,这样TypeScript知道所有属性都将存在于this.options中,但构造函数中没有任何属性是必需的。还可以使用另一个接口来解决函数中默认值的问题。

以下是完整的

在TypeScript中,有时候我们需要创建一个自定义类型的对象,并且希望能够设置默认值。下面是一种解决方法:

首先,我们定义一个选项接口,该接口包含了所有可能的属性,属性都是可选的。然后,我们定义一个常量,其中包含了默认值。在类的构造函数中,我们使用扩展运算符来设置options成员变量,将默认值与传入的选项进行合并。

interface IXOptions {
    a?: string,
    b?: any,
    c?: number
}
const XDefaults: IXOptions = {
    a: "default",
    b: null,
    c: 1
}
export class ClassX {
    private options: IXOptions;
    constructor(XOptions: IXOptions) {
        this.options = { ...XDefaults, ...XOptions };
    }
    public printOptions(): void {
        console.log(this.options.a);
        console.log(this.options.b);
        console.log(this.options.c);
    }
}

现在,我们可以这样使用这个类:

const x = new ClassX({ a: "set" });
x.printOptions();

输出结果为:

set
null
1

这种方法可以解决某些情况下的默认值问题,但不适用于所有情况。如果我们想要在类中使用这些属性进行计算,例如`const calcvalue = this.options.a * 1000;`,则可能会引发警告,因为属性可能为undefined。

为了解决这个问题,我们可以不将任何属性声明为可选的,而是让构造函数接受类型为`Partial`的参数。这样TypeScript就知道this.options中的所有属性都将存在,但构造函数中没有任何属性是必需的。

interface IXOptions {
    a: string,
    b: any,
    c: number
}
export class ClassX {
    private options: IXOptions;
    constructor(XOptions: Partial) {
        this.options = { ...XDefaults, ...XOptions };
    }
    public printOptions(): void {
        console.log(this.options.a);
        console.log(this.options.b);
        console.log(this.options.c);
    }
}

通过这种方式,我们可以在构造函数中使用部分属性作为默认值,而不影响创建的对象是否完整和类型安全。

但是,需要注意的是,这种技术在希望为部分选项填充默认值的函数中似乎效果不太好。在这种情况下,TypeScript似乎无法检测到选项已经完全填充的情况。

然而,我们可以通过使用另一个接口来解决这个问题。我们可以创建另一个接口IFOptions,其中所有选项都不是可选的,并将其用于类的options属性。这样,扩展运算符就可以正常工作,TypeScript也会满意。

以上是在TypeScript中创建自定义类型对象的一种方法,可以设置默认值。使用选项接口和常量来定义默认值,并在构造函数中使用扩展运算符进行合并。这种方法可以解决大部分情况下的默认值问题,但需要注意在函数中使用部分选项作为默认值可能会遇到一些问题。

0