Typescript方法querystring到对象

Typescript方法querystring到对象,typescript,query-string,Typescript,Query String,我正在制作一个将querystring转换为object的方法。该方法运行良好,但键入报告了错误 const fromQueryString=< T延伸{ [x:string]:字符串|数字|布尔|字符串[]|数字[]|布尔[]; } >( 查询字符串:字符串, ) => { 结案:{ [x:string]:字符串|数字|布尔|字符串[]|数字[]|布尔[]; } = {}; const arr=querystring.split('&'); arr.forEach((a)=>{ 常量[key

我正在制作一个将querystring转换为object的方法。该方法运行良好,但键入报告了错误

const fromQueryString=<
T延伸{
[x:string]:字符串|数字|布尔|字符串[]|数字[]|布尔[];
}
>(
查询字符串:字符串,
) => {
结案:{
[x:string]:字符串|数字|布尔|字符串[]|数字[]|布尔[];
} = {};
const arr=querystring.split('&');
arr.forEach((a)=>{
常量[key,value]=a.split('=');
console.log(key,toValue(value),out,key-in-out);
如果(!!键和!!值){
如果(输入输出){
out[key]=Array.isArray(out[key])
?输出[键]。按下(toValue(值))
:[out[key],toValue(value)];
}否则{
out[key]=toValue(值);
}
控制台。注销;
}
});
返回为T;
};
函数toValue(混合:字符串){
常量str=解码成分(混合);
如果(str=='false')返回false;
如果(str=='true')返回true;
return+str*0==0?+str:str;
}

据我所知,Typescript仍然包含一些有时很难理解的小故障

例如,与您的案例非常相关的:

//(1)
//无法工作,因为Typescript无法推断(字符串|数字)为元素
输入Foo=string[]| number[];
常量foo:foo=[];
foo.push(1);//当我们推一个数字元素时,您会在这里看到错误
// (2)
//工作如期进行
Baz型=阵列;
常数baz:baz=[];
推(1);
回到您的案例,我建议您将您的类型转换为案例(2)。以下是转换后的代码:

//再次分组简化
类型BaseType=字符串|数字|布尔值;
类型BaseObj=记录;
常量fromQueryString=(
查询字符串:字符串,
) => {
const out:BaseObj={};
const arr=querystring.split('&');
arr.forEach((a)=>{
常量[key,value]=a.split('=');
console.log(key,toValue(value),out,key-in-out);
如果(!!键和!!值){
如果(输入输出){
常数v=输出[键];
out[key]=Array.isArray(v)
?v.推力(toValue(value))
:[v,toValue(value)];
}否则{
out[key]=toValue(值);
}
控制台。注销;
}
});
返回为T;
};
函数toValue(混合:字符串){
常量str=解码成分(混合);
如果(str=='false')返回false;
如果(str=='true')返回true;
return+str*0==0?+str:str;
}
const fromQueryString = <
  T extends {
    [x: string]: string | number | boolean | string[] | number[] | boolean[];
  }
>(
  querystring: string,
) => {
  const out: {
    [x: string]: string | number | boolean | string[] | number[] | boolean[];
  } = {};
  const arr = querystring.split('&');

  arr.forEach((a) => {
    const [key, value] = a.split('=');
    console.log(key, toValue(value), out, key in out);
    if (!!key && !!value) {
      if (key in out) {
        out[key] = Array.isArray(out[key])
          ? out[key].push(toValue(value))
          : [out[key], toValue(value)];
      } else {
        out[key] = toValue(value);
      }
      console.log(out);
    }
  });

  return out as T;
};
function toValue(mix: string) {
  const str = decodeURIComponent(mix);
  if (str === 'false') return false;
  if (str === 'true') return true;
  return +str * 0 === 0 ? +str : str;
}