【问题标题】:Does TypeScript support constructor with object initializer?TypeScript 是否支持带有对象初始化器的构造函数?
【发布时间】:2020-07-30 07:12:32
【问题描述】:

例如,在c#中,我们有这个sn-p:

 class OrderLine
    {
        public OrderLine(){
          OrderId ="1",
          ItemTitle ="2"
        Console.WriteLine("constructing");
        }
        public string Platform { get; set; }
        public string OrderId { get; set; }
        public string ItemTitle { get; set; }
    }

    public static void Main()
    {
        var ol = new OrderLine 
        {
                Platform ="p"
        };
        Console.WriteLine(ol.Platform); 
    }

在打字稿中, 如果我使用 {} 来初始化一个对象,我将无法调用可以给我一些默认值并执行其他操作的构造函数。如果我使用 new 关键字进行一些默认构造,我的编译器不允许我使用对象初始化器(我使用的是 angular 6),我必须调用 ol.Platform 来分配属性值。 当我有几个属性要设置值时,写多个“ol”。不如使用对象初始值设定项语法快。有没有更好的办法?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你可以让构造函数接受一个对象,它的每个属性都被分配给Object.assign的实例:

    type Init = {
        age: number;
        gender: string;
    };
    class Foo {
        public name: string;
        public age: number | undefined;
        public gender: string | undefined;
        constructor(name: string, init?: Partial<Init>) {
            this.name = name;
            if (init) {
              Object.assign(this, init);
            }
        }
    }
    const f = new Foo('bob', { age: 10 });
    

    【讨论】:

    • 这很棘手,但对于我拥有数十个属性的大型模型来说,这是可行的。但是我不想定义 Partial Init 类型,我可以在这里使用任何类型吗?
    • 可以总是使用any 来避免必须进行类型检查,但这通常不是一个好主意,因为那样你可能不使用 Typescript对于代码中的那一点。如果你使用any,那么新实例的键和值实际上可以是任何东西,并且你失去了 Typescript 用来帮助你的所有类型安全。
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多