作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个类型的对象,它采用扩展另一个接口(interface)/类型的通用 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>'.
如何修改
注册任务 允许任何
Task
接受
Task<T extends Options>
有人可以帮我解决这个打字问题吗?
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>'
};
}
我需要在类(class)级别提供通用信息吗?
Task<any>
:
private static tasks: Task<any>[] = [];
允许任何子类型。
最佳答案
您可以制作TaskManager.registerTask()
一个 generic像这样的方法:
const TaskManager = {
registerTask: <O extends Options>(task: Task<O>) => {
}
};
这将导致编译器推断
O
当你调用它时:
TaskManager.registerTask(t1); // okay
// (property) registerTask: <Options>(task: Task<Options>) => void
TaskManager.registerTask(t2); // okay
// (property) registerTask: <{ id: "static"; foo: true; } & Options>(
// task: Task<{ id: "static"; foo: true; } & Options>
// ) => void
Playground link to code
关于typescript - 如何在 Typescript 中使用泛型的多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68501883/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!