【发布时间】:2021-07-26 17:06:55
【问题描述】:
如果我有一个类型的对象,它采用扩展另一个接口/类型的泛型 T。如何键入对象/方法参数以允许任何子类型泛型。
一个例子会更容易理解:
type Options = {
id: string;
};
type Task<O extends Options = Options> = {
start: (options: O) => void;
};
const t1: Task<Options> = {
start: ({ id }) => {
console.log(id);
}
};
const t2: Task<{ id: "static"; foo: true } & Options> = {
start: ({ id, foo }) => {
console.log(id, foo);
}
};
const TaskManager = {
registerTask: (task: Task) => { // maybe I miss something here, I would like to avoid Task<any>
// use task
}
};
TaskManager.registerTask(t1); // Ok
TaskManager.registerTask(t2); // ERROR: Argument of type 'Task<{ id: "static"; foo: true; } & Options>' is not assignable to parameter of type 'Task<Options>'.
如何修改 registerTask 以允许任何接受 Task<T extends Options> 的 Task
有人可以帮我解决这个打字问题吗?
编辑: 另外,如果TaskManager存储了一个Task数组,如何用泛型输入这个数组?
class TaskManager {
private static tasks: Task[] = [];
public static registerTask = <O extends Options>(task: Task<O>) => {
TaskManager.tasks.push(task); // ERROR: Argument of type 'Task<O>' is not assignable to parameter of type 'Task<Options>'
};
}
我需要在班级级别提供泛型吗?
临时解决办法是声明一个Task<any>的数组:
private static tasks: Task<any>[] = [];
允许任何子类型。
【问题讨论】:
标签: typescript types