Typescript是否不检查Array.map结果的类型?

时间:2019-01-30 16:50:34

标签: arrays typescript dictionary

interface Company {
  id: string;
  name: string;
}

type input = Company;

// This fails as the types don't match
const ACME: input = { id: '123', name: 'ACME', ceo: 'Eric' };

function mapIds(ids: string[]): input[] {
  // This compiles, but it shouldn't, or is Array.map returning something different?
  return ids.map(id => ({ id: '1', name: '1', ceo: 'Eric' }));

  // This fails as types don't match
  return [{ id: '1', name: '2', ceo: 'Eric' }];
}


鉴于上面的代码,Typescript编译器将不允许该函数返回不属于该类型的值,但是,如果返回的是来自Array.map的函数,则可以。您可以在Typescript Playground上的上述代码段中看到此内容:https://www.typescriptlang.org/play/

谁能解释这是怎么回事?

1 个答案:

答案 0 :(得分:3)

您的地图函数未指定返回类型,因此它可以返回任何内容。如果您想进行更严格的检查,则需要明确:

interface Company {
  id: string;
  name: string;
}

type input = Company;

// This fails as the types don't match
const ACME: input = { id: '123', name: 'ACME', ceo: 'Eric' };

function mapIds(ids: string[]): input[] {
  return ids.map((id):Company => ({ id: '1', name: '1', ceo: 'Eric' }));

  // This fails as types don't match
  return [{ id: '1', name: '2', ceo: 'Eric' }];
}

原因是.map函数是一种映射操作,旨在将数组中的每个元素转换为新类型。如果您未指定,TypeScript将不知道该新类型是什么。

展开以下评论。 TSC反对第return [{ id: '1', name: '2', ceo: 'Eric' }];行,因为它期望不是input[]的类型。但是,ids.map(id => ({ id: '1', name: '1', ceo: 'Eric' }));本身就很好(因为.map可以返回任何类型),然后将其分配input[]中是允许的。

感谢@ TitianCernicova-Dragomir和@ p.s.w.g对此发表的评论。