type A<T> = {
  id: string
} & Record<string, T>


const test: A<number> = {
  id: 'dd',
  anyKey: 33
}

//错误:TS2322:类型{id:string;anyKey:number;}不可分配给类型A 类型{id:字符串;anyKey:Numbers;}不能分配给类型Record&lt;字符串,数字&> 属性ID与索引签名不兼容. 类型字符串不可赋值给类型编号

为什么会出现这个错误,以及如何获取只有一个值作为字符串,而其他值是指定的类型?

推荐答案

您收到错误消息的原因是Record<string, T>id: string是重叠的,因为id是一个字符串键.

在这种情况下,Record<string, T>也可能是id: number. 不能同时为一种类型指定id: numberid: string. 您将如何访问仅基于其类型的属性? 你不能用(test as { id: number }).id或类似的魔术来得到一个不同的值,TypeScrip不允许这样做,它甚至在概念上没有意义.

这更多的是一个设计/ struct 问题,如果你需要一个具有这种特性的物体,比如id: string,试着把它从Record<string, T>中分离出来,任何东西都可以到达.

Typescript相关问答推荐

类型缩小对(几乎)受歧视的unions 不起作用

React-Native运行方法通过监听另一个状态来更新一个状态

APP_INITIALIZER—TypeError:appInits不是函数

Angular中的其他服务仅获取默认值

如何在TypeScrip中使用嵌套对象中的类型映射?

<;T扩展布尔值>;

在对象中将缺省值设置为空值

ANGLING v17 CLI默认设置为独立:延迟加载是否仍需要@NgModule进行路由?

try 使Angular依赖注入工作

react 路由不响应参数

Cypress-验证别名的存在或将别名中的文本与';if';语句中的字符串进行比较

如何在Nextjs路由处理程序中指定响应正文的类型

递归类型别名的Typescript 使用

确保财产存在

如何限定索引值必须与相应属性的id字段相同

两个子组件共享控制权

在类型{}上找不到带有string类型参数的索引签名 - TypeScript

我应该使用服务方法(依赖于可观察的)在组件中进行计算吗?

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

如何按成员资格排除或 Select 元组?