考虑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)