如何使用打字稿中的接口映射DTO?

时间:2019-02-13 12:09:08

标签: typescript dto

我正在尝试在打字稿中实现态射/ DTO映射概念。

为简要介绍态射的概念,态射是指从一种数学结构到另一种数学结构的保留结构的映射。 源X为目标Y的态射f记为f:X→Y。

有关https://en.wikipedia.org/wiki/Morphism的更多信息

我正在尝试使用态射StrictSchema以通用方式对复杂类型对象(即包含另一个对象和对象数组的对象)进行源到目标的映射。请参考下面提供的链接,以获取有关morphism npm软件包的更多信息。 https://github.com/nobrainr/morphism

我的界面

            interface IFoo {  
                  keyA: {
                  key1: number,
                  key2: number,
                  key3: [
                    {
                      key3A: string,
                      key3B: number
                    }
                  ],
                  key4: string
                },
                keyB: string,
                keyC: number,
                keyD: {
                  key1: string,
                  key2: {
                    key2A: string
                  },
                  key3: string
                },
                keyE: string
            }


            const schema: StrictSchema<IFoo> = 
            {  keyA: {
                  key1: 'somepath',
                  key2: 'somepath',
                  key3: [
                    {
                      key3A: 'somepath',
                      key3B: 'somepath'
                    }
                  ],
                  key4: 'somepath'
                },
                keyB: 'somepath',
                keyC: 'somepath',
                keyD: {
                  key1: 'somepath',
                  key2: {
                    key2A: 'somepath'
                  },
                  key3: 'somepath'
                },
                keyE: 'somepath'
            };

        const target = morphism(schema, someSourceObject);

在这里,模式是我的界面的保留对象的映射。我为每个键添加了“ somepath”作为值,并将其替换为来自实际源对象的一些实际路径。 但是这样做的同时,我得到: 错误:期望的类型来自属性'keyA',该属性在此处声明为'StrictSchema

因此,首先,我可以使用态射来保留上述场景中的映射,因为我还没有遇到使用'ScrictSchema'的任何此类示例。如果是,那怎么办?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用嵌套接口或复杂的接口签名为严格的架构实现接口。

这是有关如何实现相同效果的StackOverflow链接:Typescript: How do I define interfaces for nested objects?

或者,您可以对域使用不同的npm包,以在Typescript中对映射进行建模,例如为Typescript(https://github.com/loedeman/AutoMapper)使用Automapper

答案 1 :(得分:1)

只需跟进该请求即可。除了在较小的模式中分解接口的建议之外,我还实现了从模式创建复杂对象的功能。在Morphism: 1.9.1

的最新版本中可用

这里是Github Issueworking repl