网站搜索

序列化 - 在 TypeScript 中解析 JSON 并验证属性


class Book {
    title: string;
    datePublished: Date;

    static unserialize(str) {
        let ret = JSON.parse(str, (key, value) => {
            switch (key) {

                case 'datePublished': return new Date(value);

                default:return value;
            }
        }) as Book;

        return ret;
    }
}

在反序列化对象时,你可以像示例中一样在 JSON.parse 中使用重生函数。但你是通过常量字符串的名字访问对象的属性,因此失去了 TypeScript 的“控制”(例如,重构更改属性名称不会反映在 switch 语句中)。

有没有更好的方法来利用 TypeScript 的可能性?

答案#1

不确定这是否是最好的解决方案,但我遇到了一种至少能标记错误的方法。重构不会改变字面名称,但在更改后会被标记为错误。

诀窍是将键的类型设置为 Book 的 keyof

class Book {
    title: string;
    datePublished: Date;

    static unserialize(str) {
        let ret = JSON.parse(str, (key: keyof Book, value) => {  // "keyof Book" does the trick

            switch (key) {

                case 'datePublished': return new Date(value);
                case 'xitle' : return value;        // [ts] Type '"xitle"' is not comparable to type '"title" | "datePublished"
                default:return value;
            }
        }) as Book;

        return ret;
    }
}