我无法在泛型类型上使用局部变量:
let result = [];
extractArrays(arrs, result);
console.log(result);
function extractArrays(arr, result) {
let newResult = arr.reduce((acc, curr) => {
if (Array.isArray(curr)) {
extractArrays(curr, result);
} else {
acc.push(curr);
}
return acc;
}, []);
newResult.length && result.push(newResult);
}
我希望该示例能够正常工作,因为interface HasName {
name: string;
}
class Tools<T extends HasName> {
public create: (params: Partial<T>) => T;
createWithName = (nameArg: string) => {
this.create({ name: nameArg })
}
}
应确保T extends HasName
将具有T
字段,并且name
应将任何对象与键的任何子集匹配(params: Partial<T>)
。
但是,T
行上有打字稿编译错误:
'{类型名称:字符串; }”不能分配给“ Partial”类型的参数。
有人应该帮我理解为什么this.create({ name: nameArg })
不能分配给{ name: string }
的原因,但应该基于我上面的逻辑吗?
谢谢。
答案 0 :(得分:2)
简而言之,TypeScript是正确的,但是只要您谨慎使用T
的内容,就可以使用强制类型转换使错误消失:
this.create({ name: nameArg } as Partial<T>)
关于为什么的TypeScript就在这里,这是因为您可以创建扩展HasName
的类型,但是{name: string}
并不是该类型的有效对象。< / p>
最简单的示例就是创建一种类型,其中name
比string
更具体:
interface HasSpecificName extends HasName {
name: "alice" | "bob";
}
在这种情况下,无法将{name: nameArg}
分配给nameArg
,其中Partial<HasSpecificName>
是任意字符串。