Typescript将{[key:string]:T}缩小为对象文字

Typescript将{[key:string]:T}缩小为对象文字,typescript,Typescript,我想编写一个函数,强制对象的类型为{[key:string]:T},并返回所提供参数的对象文本 例如,如果我有以下类型A: interface A{ a: string, b: number } 我想要一个函数B,它接受一个具有属性的对象,所有类型都是a,并返回提供的对象,该对象的属性可以使用点表示法访问 我目前的职能是: const B = (arg: {[key: string]: A}) => arg; 但当我这样称呼它时: const c = B({ a: {

我想编写一个函数,强制对象的类型为{[key:string]:T},并返回所提供参数的对象文本

例如,如果我有以下类型A:

interface A{
  a: string,
  b: number
}
我想要一个函数
B
,它接受一个具有属性的对象,所有类型都是
a
,并返回提供的对象,该对象的属性可以使用点表示法访问

我目前的职能是:

const B = (arg: {[key: string]: A}) => arg;
但当我这样称呼它时:

const c = B({
  a: {
    a: "test",
    b: 1
  }
})
我无法使用点符号访问属性
a
,如
c.a

如何使函数B根据接收到的内容返回一个文本类型,以便我可以使用点表示法访问属性?

您需要使用

接口A{
a:弦,
b:号码
}
常数B=(arg:T):T=>arg;
常数c=B({
a:{
答:“测试”,
b:1
}
})
控制台日志(c.a.a)

为什么需要
B
呢?这是一个库,所以它允许JS自动完成和检查我的特定用例的类型。但是
B
函数实际上做了什么,不使用它是无法实现的?如果你写
const c={a:{a:“test”,b:1}
,那么你可以写
c.a
并获得自动完成建议。是的,但我想强制执行
c
在创建时遵循模式
{[key:string]:a}
。通过将其传递给函数,非Typescript用户在创建变量时将获得自动完成和警告。也许我应该更新我的问题,让它更清楚。我认为它是泛型的,我实际上试过使用Record,但显然我用错了。谢谢请注意,如果您编写
{[k:string]:A}
而不是
记录
,则其效果相同-这些是等效的。
interface A{
  a: string,
  b: number
}

const B = <T extends Record<string, A>>(arg: T): T => arg;

const c = B({
  a: {
    a: "test",
    b: 1
  }
})

console.log(c.a.a)