TypeScript报告泛型函数中不存在的属性

5 generics typescript

考虑TypeScript中的以下泛型函数:

interface Foo { id: string; }
const foo = <Foo>{id: 'bar'};
function baz<T>(x: T) { console.log(x.id); }
baz(foo);
Run Code Online (Sandbox Code Playgroud)

这不编译:

test.ts(6,17): error TS2339: Property 'id' does not exist on type 'T'.

在我看来,TypeScript应该能够处理这种情况.如果不能,那么我必须做这样的事情:

interface IHasId { id: string; }
interface Foo extends IHasId { }
const foo = <Foo>{id: 'bar'};
function baz<T>(x: IHasId) { console.log(x.id); }
baz<Foo>(foo);
Run Code Online (Sandbox Code Playgroud)

是否有任何替代或更惯用的方式来处理这种情况?

Ale*_* L. 17

有意义的是,第一个样本不能编译.Typescript就是添加类型检查.如果你想禁用它,你可以使用any,但为什么在这种情况下使用泛型?

如果要在泛型类型上定义约束,可以这样做:

function baz<T extends IHasId>(x: T) { console.log(x.id); }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,约束可以内联定义:

function baz<T extends { id: string; }>(x: T) { console.log(x.id); }
Run Code Online (Sandbox Code Playgroud)