Typescript方法querystring到对象
我正在制作一个将querystring转换为object的方法。该方法运行良好,但键入报告了错误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
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;
}