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

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

最佳答案

它不接受{ 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];

但这会让您发现一个bug,正如第一个示例中编译的那样,但在运行时不是这样。看起来要么这不是你想要的,要么类型没有描述你想要的。

08-05 07:26