typescript 如何将HeadersInit转换为Object< string,string>类型?

dtcbnfnu  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(140)

长话短说,我需要将RequestInit的头文件转换为另一个库可以理解的不同数据类型。此库要求头文件为Object<string, string>。我希望我可以简单地做一些事情,比如:

headers: {
 ...init?.headers,
},

果然没这么简单。我相信这是因为init.headers中的一些值是number类型的。我如何转换这些,以便TypeScript不会抱怨?

uqdfh47h

uqdfh47h1#

TypeScript、头和对象

你把错误的原因弄对了。标头可以包含非字符串或多值标头。简单地在一个新对象中使用init.headers并不能保证Object<string,string>,这就是TypeScript触发错误的原因。
我创建了一个示例函数来完成这项工作。

验证码:

const convertHeadersInitObject = (
    headersInit: HeadersInit | undefined
  ): Record<string, string> => {
    const headersObj: Record<string, string> = {};

if (!headersInit) 
  return headersObj;

if (headersInit instanceof Headers) {
  for (const [key, value] of headersInit.entries()) 
    headersObj[key] = value;
} 

else if (Array.isArray(headersInit)) {
  headersInit.forEach(([key, value]) => {
    headersObj[key] = String(value);
  });
}

else {
  for (const [key, value] of Object.entries(headersInit)) 
    headersObj[key] = String(value);
 }

 return headersObj;
};
ivqmmu1c

ivqmmu1c2#

由于Headers构造函数由HeadersInit构成,

function headersInitToRecord(headersInit: HeadersInit) {
    return Object.fromEntries(new Headers(headersInit).entries());
}

或者,如果您希望支持undefined

function headersInitToRecord1(headersInit?: HeadersInit | undefined) {
    // new Headers(undefined) is fine
    return Object.fromEntries(new Headers(headersInit).entries());
}

或者,如果您想支持undefined返回undefined

function headersInitToRecord2(headersInit?: HeadersInit | undefined) {
    return headersInit && Object.fromEntries(new Headers(headersInit).entries());
}

测试操场:

console.log(
    headersInitToRecord([['foo', 'bar']]),
    headersInitToRecord({foo: 'bar'}),
    headersInitToRecord(new Headers([['foo', 'bar']])),
)

相关问题