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/
谁能解释这是怎么回事?
答案 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对此发表的评论。