TypeScript - 将对象文字传递给类构造函数

时间:2016-08-22 10:44:11

标签: javascript typescript

您可以将默认值传递给类构造函数吗?在此,last会返回undefined

class greatFunction {
    options: {
        names:  {first: 'Joe', last: 'Bloggs'}
    }
    constructor(options) {
        console.log(options.names.first + ' ' + options.names.last);        
    }
}

调用:

new greatFunction({
    names: {
        first: 'Paul'
    }
});

3 个答案:

答案 0 :(得分:3)

而不是这样做,为什么不创建这样的界面

interface names { 
      firstname:string;
      lastname ?: string;
  }

因为您无法创建参数的属性可选。

或者你做的就像这样

interface IOptions{
names:INames;
     }

 interface  INames {
    first:string;
    last?:string;
  }

   class greatFunction{

        constructor (options:IOptions){
          options.names.last = options.names.last?options.names.last:'Default';
       console.log(options.names.first + ' ' + options.names.last)
    }
 }

   new greatFunction({names:{first:'Theophilus'}});

它应该在控制台中返回默认值

答案 1 :(得分:0)

尝试设置默认值:

class GreatFunction {
  options: {
    names:  {first: 'Joe', last: 'Bloggs'}
  }
  constructor({names: {first=this.options.names.first: firstName, last=this.options.names.last: lastName}}) {
    console.log(`${firstName} ${lastName}`)        
  }
}

或者,使用库,例如​​lodash.defaults()似乎适合您的用例。

答案 2 :(得分:0)

您需要将某些内容传递给该函数,因此一个选项是尝试这样的事情:

class greatFunction {
    defaultOptions = {
        names: { first: 'Joe', last: 'Bloggs' }
    }
    constructor(options) {
        if (options == null)
            options = this.defaultOptions;
        console.log(options.names.first + ' ' + options.names.last);
    }
} 

然后,您可以使用

创建新的greatFunction
let x = new greatFunction(null)

或者:

let y = new greatFunction({ names: { first: 'Test', last: 'Blah' } });

或者,不要使用构造函数,并在初始化后使用属性。例如:

class greatFunction {
    public options = {
        names: { first: 'Joe', last: 'Bloggs' }
    }
    constructor() { }
    doSomething() {
        console.log(this.options.names.first + ' ' + this.options.names.last);
    }
} 

然后使用:

let x = new greatFunction();
x.options = { names: { first: 'Test', last: 'Blah' } };
x.doSomething();