繁体   English   中英

Typescript 类型定义的映射 Object 已经定义

[英]Typescript type definition of a mapped Object already define

我正在使用 Typescript 开展一个项目。 代码工作正常。 我只是想知道对于已经过滤和定义的映射 Object 的类型定义的最佳实践是什么。 例如,如果我有以下代码:

const person: Person = {
    name: 'Joe',
    surname: 'Doe',
    age: 30,
    address: [{
        mainAddress: {
            street: "Queen st",
            number: 9,
            building: 'main',
            unit: 5,
        },
        secundaryAddress: {
            street: "King st",
            number: 7,
            house: 'The house'
        }
    }]
}

interface Person {
    name: string
    surname: string
    age: number
    address: [{
        mainAddress: {
            street: string
            number:number
            building: string
            unit: number
        }},
        {
        secundaryAddress: {
            street: string
            number: number
            house: string
        }
    }]
}
const filterPerson = person.address.filter((ad: any) => ad.mainAddress ? true : false)

const mappedAddress = filterPerson.map((m: any) => m.)

在我对主Object进行过滤之后。 我需要 map 结果。 在这种情况下, filterPerson.map可以很好地与any作为类型定义一起使用,但是是否有最好的方法来定义过滤器中的ad和 map 中的m或者在这种情况下我应该为两者编写一个新接口。

如果我删除过滤器上的any内容并在示例的 mainAddress 上删除 hover,则会弹出错误 [![enter image description here][1]][1]

如您所见,我的代码中的 Object 不同,但此处示例的语法相同。 [1]: https://i.stack.imgur.com/hfaro.png

你给我们下面的 object address为 object

const person: Person = {
    name: 'Joe',
    surname: 'Doe',
    age: 30,
    address: {
        mainAdress: {
            street: "Queen st",
            number: 9,
            building: 'main',
            unit: 5,
        },
        secundaryAdress: {
            street: "King st",
            number: 7,
            house: 'The house'
        }
    }
}

但是然后给我们这个接口,它的address是一个对象数组。

interface Person {
    name: string
    surname: string
    age: number
    address: [{
        mainAdress: {
            street: string
            number:number
            building: string
            unit: number
        }},
        {
        secundaryAdress: {
            street: string
            number: number
            house: string
        }
    }]
}

然后你给我们一个不完整的过滤方法:

const mappedAddress = filterPerson.map((m: any) => m.)

请修正你的例子

编辑:假设address实际上定义如下,我将创建 4 个接口,一个用于主要Person ,一个用于Address ,一个用于每种Adress

    address: [{
        mainAdress: {
            street: "Queen st",
            number: 9,
            building: 'main',
            unit: 5,
        },
        secondaryAdress: {
            street: "King st",
            number: 7,
            house: 'The house'
        }
    }]
interface MainAdress {
   street: string;
   number: number;
   building: string;
   unit: number;
}

interface SecondaryAdress {
    street: string;
    number: number;
    house: string;
}

interface Address {
    mainAdress?: MainAdress;
    secondaryAdress?: SecondaryAdress;
}

interface Person {
    name: string
    surname: string
    age: number
    address: Address[];
}

然后您的filterPerson const 可以键入如下:

const filterPerson: Address[] = person.address.filter((ad: (Address)) => ad.mainAdress ? true : false)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM