Typescript无法将对象文字分配给泛型类型

时间:2018-12-17 15:09:09

标签: typescript

如果我尝试使用具有类型约束的泛型类型的对象常量,则会遇到类型错误,我正在努力找出原因:

type WithKey = {
  readonly akey: string;
}

function listOfThings<T extends WithKey>(one: T) {
  // This is ok
  const result2: Array<T> = [one];

  //This errors with Type '{ akey: string; }' is not assignable to type 'T'.
  const result: Array<T> = [{ akey: 'foo' }]; 

  return result;
}

2 个答案:

答案 0 :(得分:2)

不接受{ akey: 'foo' }的原因是因为T仅扩展 WithKey,所以实际上是WithKey的对象是' t必须可分配给T。例如:

listOfThings<{ akey: string; aflag: boolean }>()

{ akey: 'foo' }不满足{ akey: string; aflag: boolean }

您可以使用断言强制编译器:

const result: Array<T> = [{ akey: 'foo' } as T]; 

但这为您打开了一个漏洞,因为在第一个示例中它将编译,但在运行时不是正确的。似乎这不是您想要的,或者类型不能描述您想要的。

答案 1 :(得分:1)

{ akey: 'foo' }实际上具有类型,不是通用类型。这就是为什么它不喜欢您的作业。

编译器无法将{ akey: 'foo' }理解为WithKey类型。

您可以通过强制转换此打字稿来强制打字稿

const result: Array<T> = [<T>{ akey: 'foo' }];