根据typescript中的接口进行动态类型检查


export function createListItems<T>(data:any[]): T[]{
const items: T[] = [];
for (let i = 0; i < data.length; i++) {
let obj: Partial<Record<keyof T,string | number >>={};//must have age and name, string and number type 
Object.keys(data[i]).map((key:string) => {
obj[key]=data[i][key];//taking address as well and boolean type as well
});
items.push(obj as T);

}
return items;
}
interface userDetails{
name:string;
age:number;
}

console.log(createListItems<userDetails>([{name:true,address:false},{name:"kailash",age:"string"}]);

在上面的代码中,obj应该只取name和age,但也取address属性。它应该只接受字符串和数字类型,但也接受布尔类型。我希望名称的类型应该只有字符串,年龄的类型应该是数字。但对于name属性,它甚至动态地采用布尔值。如何检查接口中是否存在动态键,并且它的值和接口中定义的类型匹配?

当你说let obj: Partial<Record<keyof T,string | number >>={}时,你是说obj将是一个记录,其中键是T的键,值是字符串或数字。但是,您声明该函数采用any类型的数组。类型any不是一个真正的类型,它更像是一个写着";禁用对该事物的所有类型检查";,因此,当您对数据进行迭代时,其中的值也都是any类型,因此TypeScript相信该类型是正确的。

如果您希望函数只接受具有该类型的项,那么您需要在函数的参数中用类似function createListItems<T>( data: Partial<T>[] ): T[]的东西来声明它。如果你真的想让参数接受any而只返回T[],那么就由你来确保类型是正确的,如果你使用类型any,TypeScript可以帮助你,这实际上是告诉它不要帮助你。

最新更新