打字稿:对象到类

时间:2017-09-30 09:38:57

标签: javascript typescript

假设我有一个C类和一个Object O实例(来自JSON)。

class C {
  str:string;
  num:number;
}

var o = JSON.parse ("{\"num\":123, \"str\":\"abc\"}");

有没有办法可以用o分配/初始化一个C实例,它会检查未定义的值以及我自己在复制构造函数/函数中执行它的类型吗?

如果值缺失/未定义或类型不匹配,我想收到错误或异常。

谢谢!

5 个答案:

答案 0 :(得分:3)

我来到这里是想从对象字面量创建一个类实例。 Object.assign() 有效,但不是类型安全的。当然,如果您有预期的 JSON 源,但我只想实例化一个具有已知状态的类。

From the TypeScript docs,一个类也作为一个类型。因此,以下将起作用:

class C {
    str: string;
    num: number;

    constructor(source: Partial<C>) {
        Object.assign(this, source);
    }
}

// Ok - all properties
const c1 = new C({
    num: 123,
    str: "abc"
});

// Ok - only some of the properties
const c1 = new C({
    num: 123,
});

// Error: unknown property `unexpectedPropertyName`
const c2 = new C({
    num: 123,
    unexpectedPropertyName: "abc"
});

答案 1 :(得分:2)

您可以使用Object.assign

class C {
    str:string;
    num:number;
}
var o = JSON.parse("{\"num\":123, \"str\":\"abc\"}");
const instance:C = Object.assign(new C(), o);

答案 2 :(得分:1)

以下是直接创建对象的示例,它将为您提供实时错误检查。 JSON.parse的问题是编译器在编译时不会检查它返回的内容。如果使用未知的实时数据,则必须手动编写一些错误检查。

interface Obj {
  str: string
  num: number
}

class C {
  constructor(o:Obj) { 

  }
}

var o = {test:43, str:"abc"}
var p = {num:43, str:"abc"}

var instanceOne = new C(o) // not allowed
var instanceTwo = new C(p) // allowed

答案 3 :(得分:1)

Typescript是一个在编译时运行的类型系统,因此你所要求的是不可能的。

您可以查看type guards,也可以使用它们在某种parse函数的条件块中提供类型推断。

答案 4 :(得分:1)

您要求的是JSON模式验证器。验证必须在运行时运行。检查https://github.com/epoberezkin/ajv以获取完整的JSON模式验证程序,或https://www.npmjs.com/package/js-schema查看更简单的验证程序。