类和泛型上的打字稿错误

时间:2018-06-29 23:16:01

标签: typescript

我无法在泛型类型上使用局部变量:

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 }的原因,但应该基于我上面的逻辑吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

简而言之,TypeScript是正确的,但是只要您谨慎使用T的内容,就可以使用强制类型转换使错误消失:

this.create({ name: nameArg } as Partial<T>)

关于为什么的TypeScript就在这里,这是因为您可以创建扩展HasName的类型,但是{name: string}并不是该类型的有效对象。< / p>

最简单的示例就是创建一种类型,其中namestring更具体:

interface HasSpecificName extends HasName {
    name: "alice" | "bob";
}

在这种情况下,无法将{name: nameArg}分配给nameArg,其中Partial<HasSpecificName>是任意字符串。