使用类将JSON对象强制转换为打字稿类型变量的正确方法?

时间:2015-12-30 17:17:13

标签: javascript json typescript

这是我正在尝试做的一个更简单的例子:

export class Person{
    id:Number;
    name:String;
}

export class PersonForm{

    // This line:
    default:Person = {name: "Guy"};
    // Gives the following error:
    //  Error:(25, 5) TS2322: Type '{ name: string; }' is not assignable to type 'Person'.
    //  Property 'id' is missing in type '{ name: string; }'.

    // I tried <Person>{name: "Guy"} but it gives the same error.

}

如果我不使用不存在的属性,我怎么能让编译器忽略这个问题,或者如何声明类,这样我可以用这种方式进行赋值而不是新的Person()然后只设置属性我想。

注意:将具有所有属性的对象发送到构造函数中并不是我期望的解决方案。使用界面也可以,因为我可以声明字段是可选的,我怎么能在类中做同样的事情?

添加更多信息:

我正在努力实现的主要目标:

找到声明类(不是接口)的最佳方法,这样我就可以在一行中使用干净的代码初始化它,只设置我想要设置的参数。在Java中,您将重载构造函数或使用Builder模式。

我当然可以尝试使用构建器模式,但我正在寻找更多的打字方式来实现它,如果有的话。

4 个答案:

答案 0 :(得分:3)

我找到了最简单的方法,而且这是可能的。我想我之前尝试过这种方式,但事实上我正在使用“数字”和“字符串”类型而不是“数字”&amp; “string”,可能会给我编译器的误导性错误,下面的代码对我来说很有意义:

export class Person{
    constructor(
        public id?: number, // make sure you use number and string types instead of Number and String types
        public name?: string // make sure you make all properties optional using "?"
    ){}
}

export class PersonForm{
    default:Person = <Person>{name: "Guy"};
}

答案 1 :(得分:0)

你可以用构造函数编写你的类。

export class Person {
  constructor(public id: number, public name: string) {}
}

但你必须这样称呼它。

let person = new Person(null, "George");

答案 2 :(得分:0)

将JSON表达式转换为any。分配default的行变为:

default: Person = <any>{ name: "Guy" };

答案 3 :(得分:0)

这是补充此处发布的其他答案的另一种选择..

如果你有一些对象初始化

{
  name:"John" 
}

并且您明确需要类Person的实例,但是希望保留对象初始化器,同时保留类Person创建的默认值,您可以通过将整个对象传递到类构造函数:

var instance = new Person({name:"John"});

其中

export class Person
{
   id:number = 0; //or generate one
   name:string = "unknown";
   constructor(opts:{id?:number; name?:string}){
      if(opts){
          this.id = opts.id || this.id;
          this.name = opts.name || this.name;
      }
   }
}

的示例:

var people = [
   new Person(),
   new Person({name:"John"}),
   new Person({name:"James", id:10}),
   new Person({id:20})];