TypeScript - pass to constructor entire object

前端 未结 3 1556
我在风中等你
我在风中等你 2020-12-11 18:48

I have a class at type script:

export class Child {
  name:string;
  age:number;
}

I want to force class instances to have only properties

3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-11 19:08

    In my opinion the cleanest way to build your class instances from an arbitrary object would be using destructuring. You still have assignments for all your fields, but you have (very clean) control over what happens if the field doesn't exists, and also what fields you will assign to your classes fields:

    export class Child {
      name:string
      age:number
    
      constructor({name = 'default name', age = 0} = {}) {
        this.name = name
        this.age = age
      }
    }
    

    Now this lets you create your instances from Objects or anys or any partial object literals, but when using literals it won't let you add extra stuff, which seems like is what you need:

    const c0 = new Child({} as any /* as Object works as well */)
    const c1 = new Child({}) // Literal, will be using defaults
    const c2 = new Child() // No argument, using defaults only
    const c3 = new Child({ name: 'a', age: 1 })
    const c4 = new Child({ name: 'b', foo: 'bar'}) // error with foo
    

    Generated js will check for everything that you would check manually:

    define(["require", "exports"], function (require, exports) {
        "use strict";
        var Child = (function () {
            function Child(_a) {
                var _b = _a === void 0 ? {} : _a, _c = _b.name, name = _c === void 0 ? 'default name' : _c, _d = _b.age, age = _d === void 0 ? 0 : _d;
                this.name = name;
                this.age = age;
            }
            return Child;
        }());
        exports.Child = Child;
    });
    

    Try and see in the playground what is generated from this!

提交回复
热议问题