【问题标题】:Typescript cannot assign object literal to a generic typeTypescript 无法将对象文字分配给泛型类型
【发布时间】:2018-12-18 00:00:29
【问题描述】:

如果我尝试将对象字面量与具有类型约束的泛型类型一起使用,则会出现类型错误,我正在努力找出原因:

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;
}

【问题讨论】:

  • 您希望调用const hmm = listOfThings({akey: "foo", bkey: 123}); 会产生什么结果?
  • 最近been proposed 表示,该错误虽然准确,但应该减少混淆。

标签: typescript


【解决方案1】:

它不接受{ akey: 'foo' } 的原因是因为T扩展 WithKey,因此实际上是WithKey 的对象不一定可分配给T。例如:

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

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

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

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

但这会给你带来一个错误,因为在第一个例子中会编译但在运行时不是真的。似乎这不是您想要的,或者类型没有描述您想要的。

【讨论】:

    【解决方案2】:

    { akey: 'foo' } 实际上有类型,它不是泛型类型。这就是它不喜欢你的任务的原因。

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

    你可以通过强制转换来强制打字

    const result: Array&lt;T&gt; = [&lt;T&gt;{ akey: 'foo' }];

    【讨论】:

    • 您可以强制它这样做,但除非您知道自己在做什么,否则您不应该这样做。 listOfThings({akey: "foo", bkey: 123}) 将推断T{akey: string, bkey: number},然后{akey: string}绝对不能分配给它
    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多