如何通过外部函数签名类型实现可访问泛型变量的泛型函数?
泛型函数签名与实现分离的正确写法
你之前的写法无效,是因为声明foo: TFooFn<T>时,T没有被定义——泛型参数需要绑定到函数本身,而非直接在类型别名后使用。以下是两种可行的实现方式:
方式一:用泛型类型别名,声明时明确泛型签名
// 先定义泛型函数类型 type TFooFn<T extends Bar> = (a: string) => T; // 声明函数时,将泛型参数绑定到函数的类型签名上 const foo: <T extends Bar>(a: string) => T = (a) => { const bar = createBar<T>(); return bar; };
方式二:用泛型函数接口(更贴合分离定义的习惯)
// 定义泛型函数接口,泛型参数作用于函数签名 interface TFooFn { <T extends Bar>(a: string): T; } // 直接用接口约束函数,实现时可直接使用泛型T const foo: TFooFn = (a) => { const bar = createBar<T>(); return bar; };
核心逻辑是:泛型函数的类型需要让泛型参数属于函数本身,而非类型别名的固定参数。把泛型定义在接口的函数签名里,或者在变量类型中显式声明泛型,TypeScript就能正确识别函数体内的T为泛型参数。
内容的提问来源于stack exchange,提问作者Seba Kerckhof
相关产品推荐
相关产品推荐

