假设我有一个C类和一个Object O实例(来自JSON)。
class C {
str:string;
num:number;
}
var o = JSON.parse ("{\"num\":123, \"str\":\"abc\"}");
有没有办法可以用o分配/初始化一个C实例,它会检查未定义的值以及我自己在复制构造函数/函数中执行它的类型吗?
如果值缺失/未定义或类型不匹配,我想收到错误或异常。
谢谢!
答案 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查看更简单的验证程序。