This question already has answers here:
Is it possible to restrict typescript object to contain only properties defined by its class ?
                                
                                    (4个答案)
                                
                        
                2年前关闭。
            
        

我有一个强类型的集合,如下所示:

interface IUser {
  id: number,
  name: string
}

const users: IUser[] = [
  { id: 1, name: 'Bob' },
  // ...
];


然后,我使用map函数创建一个新集合:

const nextUsers: IUser[] = users.map((user: IUser) => ({
  ID: 3, // wrong field name
  name: 'Mike',
  id: 3,
}));


如您所见,存在一个名称错误的字段-ID。好吧,问题是为什么它work?))

最佳答案

这是打字稿检查多余属性的方式的副产品。一点背景:

如果类型B至少具有类型A的所有属性,则通常可以从类型B分配类型A。因此,例如,执行此分配时不会出现错误:

let someObject = { id: 3, name: 'Mike', lastName: 'Bob' }
let user: { id: number, name: string } = someObject // Ok since someobject has all the properties of user
let userWithPass : { id: number, name: string, pass: string } = someObject // Error since someobject does not have pass


Typescript唯一会抱怨多余属性的情况是,当我们尝试直接将对象文字分配给具有已知类型的某个对象时:

// Error excess property lastName
let user: { id: number, name: string } =  { id: 3, name: 'Mike', lastName: 'Bob' }


现在,以您的情况为例,typescript将首先将结果的类型推断为map到返回的对象文字的类型,这都是有效的,然后将检查此类型是否与IUser数组兼容,所以没有错误,因为我们从未直接尝试将对象文字分配给IUser类型的东西。

如果我们明确设置传递给map的arrow函数的返回类型,我们可以确保得到一个错误。

const nextUsers: IUser[] = users.map((user: IUser) : IUser => ({
    id: 3,
    name: 'Mike',
    ID: 152,
}));

关于javascript - TypeScript:映射强类型集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51402045/

10-12 00:04
查看更多