打字稿验证道具中的 JSON 解析

Posted

技术标签:

【中文标题】打字稿验证道具中的 JSON 解析【英文标题】:JSON parse in typescript validating props 【发布时间】:2018-09-07 00:31:15 【问题描述】:
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 中的 revive 函数。但是您正在通过常量字符串中的名称访问对象的属性,从而失去了打字稿的“控制”(例如,重构更改道具的名称不会反映在 switch 案例中)。

有没有更好的方法来使用打字稿的可能性?

【问题讨论】:

您可以根据您的收入JSON格式创建自定义模型,然后使用instanceof或使用此构造:function isJsonNode(d: Parent | Child): pet is Child return (<Child>d); 其中ChildParent是自定义类型 也许这会有用:***.com/a/40718205/9050727 或者这个:aliolicode.com/2016/04/23/type-checking-typescript 【参考方案1】:

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

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

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;
    

【讨论】:

有没有更好的方法,因为我有很多属性?

以上是关于打字稿验证道具中的 JSON 解析的主要内容,如果未能解决你的问题,请参考以下文章

如何访问打字稿中的字段验证错误?

打字稿中的样式组件“as”道具和自定义道具

使用打字稿测试 JSON

打字稿反应组件中的反应/道具类型eslint错误

在打字稿中提取道具以分离Vue组合API中的模块

如何将打字稿定义解析为json?