Typescript:声明空类对象

时间:2018-05-27 23:57:25

标签: javascript typescript object

是否可以从没有默认值的类声明对象?

我有一个类似下面的课程;

export class Month {
 January: string;
 February: string;
 March: string;
 ...
}

mapMyPayload(specialMonths: Birthdays) {
 let myMonth = new Month;
 console.log(myMonth); //=> Month {}
    // here I expect the Object.keys(myMonth) 
    // returns {January=undefined, February=undefined, ...}
    // since I assume the new Month 
    // declares the myMonth as an object with undefined as its value
 Object.keys(myMonth).forEach(m => {
    // iterate thru the keys 
    // check if the month exists inside the specialMonths
    // and is not null or undefined
  if (specialMonths[m] != null) { 
   myMonth[m] = specialMonths[m];
 );
 return myMonth;
}

我想要实现的是检查对象中的任何undefinednull并返回此类。

我查看了许多示例代码和文档,要么您具有隐式构造函数,要么使用显式构造函数,您可以使用类名称的new来声明新类,但随后它们会声明一些值。所以我认为实例在被某些外部范围声明之前不存在。

2 个答案:

答案 0 :(得分:3)

class Foo {
  a: string;
  b: string;
  c: number;
}

var foo = new Foo();
console.log(foo.a); //undefined

更新: 这转化为以下JS代码:

var Foo = /** @class */ (function () {
    function Foo() {
    }
    return Foo;
}());
var foo = new Foo();
console.log(foo.a);

您的对象没有任何密钥,因为它们尚未定义,因此它们会使用" undefined"字面意思而不是" undefined"作为一种价值。 您可以尝试在默认情况下执行某些操作,以及#34; undefined"作为价值:

class Foo {
  a: string = undefined;
  b: string = undefined;
  c: number = undefined;
}

var foo = new Foo();
console.log(foo.a); //undefined
console.log(foo); //=> Foo{a: undefined, b: undefined, c: undefined}
Object.keys(foo).forEach(property => console.log(property));
// keys log as empty and not undefined

这转化为以下JS:

var Foo = /** @class */ (function () {
    function Foo() {
        this.a = undefined;
        this.b = undefined;
        this.c = undefined;
    }
    return Foo;
}());
var foo = new Foo();
console.log(foo.a); //undefined
console.log(foo); //=> Foo{a: undefined, b: undefined, c: undefined}
Object.keys(foo).forEach(function (property) { return console.log(property); });
// keys log as empty and not undefined as part of the forEach loop

我个人建议反对这个实现,因为它容易出现意外行为,并且违反了打字稿带来的静态类型的JS版本。

也许如果您想详细说明您尝试实现的目标,我们可以为您提供更好的解决方案?

答案 1 :(得分:0)

为什么不可能?

类中的字段和属性将设置为默认值,在您的情况下为字符串null,如果您不指定它们的默认值,如下所示:

export class Month {
   January: string = "Something";
   February: string = "Something";
   March: string = "Something";
   ...
}