【发布时间】:2018-12-08 15:00:56
【问题描述】:
问题:
假设我有一个使用泛型的第三方库的接口
interface SomeInterface<T> {
...
}
在我的代码中,我有一个实现该接口的实例
const someInstance; // type signature: SomeInterface<string>
鉴于此实例,我将如何访问该实例的泛型类型参数 T 的类型(在此示例中,我如何能够从 someInstance 中提取 string 类型)?我在运行时不需要它,我只需要它以便我可以定义期望的类型作为函数中的参数:
function someFunction(someArg: ???) {...}
基本上我希望能够做到这一点,这是行不通的:
function someFunction(someArg: typeof T in someInstance) {...}
具体用例:
我在这里的具体用例是我使用redux-act 和redux-sagas 包。 Redux-act 提供了一个动作创建者工厂,它产生一个类型签名为ActionCreator<P, M>的动作创建者
// someActionCreator has type signature of ActionCreator<string, void>
const someActionCreator = createAction<string, number>(...);
当通过someActionCreator(payload: P, metadata: M) 调用此动作创建者时,它会生成Action<P, M>。
// someAction has a type signature of Action<string, number>
const someAction = someActionCreator("foo", 1);
在 redux sagas 中,我可以访问动作创建者实例(即 someActionCreator),其中 P 和 M 已定义类型,但我无法访问动作本身。但是,处理函数期望操作作为参数,例如
function* someEffectHandler(action: Action<string, void>) {...}
由于 Typescript 知道 P 和 M 在 someActionCreator 上的类型,我希望能够在 someEffectHandler 的类型声明中访问它们。
当动作创建者应该能够为我提供类型化参数时,我试图避免为每个动作编写大量样板。
//Trying to avoid this
type SomeActionPayload = string;
type SomeActionMetadata = number;
export type SomeAction = Action<SomeActionPayload, SomeActionMetadata>;
export const someActionCreator = createAction<SomeActionPayload, SomeActionMetadata>(...);
【问题讨论】:
-
并非总是可行,但您可以深入到类型为 T 的属性并执行
typeof该属性。 -
@unional 不幸的是,因为实例还没有 T 的值(只是它期望的类型),实例上没有属性可以调用
typeofon。
标签: typescript generics