【发布时间】:2023-03-08 00:46:01
【问题描述】:
我有这个基础课:
type Action = { type: string; payload?: {} }
type Dispatch<ActionType extends Action> = (action: ActionType) => void
type Actions =
| { type: '@ADD', payload: { item: string, id: string } }
| { type: '@REM', payload: { id: string } }
class CardActions implements ActionClass<Actions> { // this isn't working as I expect, see below
constructor(private dispatch: Dispatch<Actions>) {}
disp(action) {} // this isn't working
}
试图实现一个接口对构造函数和disp函数都不起作用,它总是有错误:
“CardsActions”类型中缺少索引签名
或
“CardActions”类错误地实现了“ActionClass”接口。
export interface ActionClass<ActionType extends Action> {
// new(dispatch: string): any;
[actionKey: string]: (action: ActionType['type']) => void
}
我希望它可以像任何功能一样工作,我误解了吗?
期待
interface Func {
(action: Actions['type']): void
}
const func: Func = (action) => {} // this will work
为什么他们不能像彼此一样工作?我怎样才能让它发挥作用?
【问题讨论】:
-
您真的希望字符串索引签名和调用签名表现相同吗?也就是说,您是否希望能够像调用函数一样调用
CardActions的实例?如果不是,您能否详细说明为什么您认为它们应该相同?如果您删除问题中以“我希望它像任何功能一样工作,我误解了吗?”开头的所有内容,我可以回答为什么它不起作用。但是我不确定将类或类实例比作函数会得到什么。 -
你也有
// new(dispatch: string): any;在那里,被注释掉了。你在做什么?为什么它是你问题的一部分?如果您在其中注释它将不起作用,因为在class Foo implements Bar {}中,Bar类型对应于Foo的instances,而不是Foo构造函数本身。Foo的实例将不可构造,因此您不希望Bar中的构造签名。如果没有ms/TS#33892 之类的东西,就无法使用implements来约束类的静态方面。 -
我已经回答了这个问题,好像
// new(dispatch: string): any;和以I'm expecting it to work like any function开头的所有内容都不存在。如果您需要其他内容,请修改问题并详细说明这些要点。祝你好运! -
谢谢你的回答,我只是出于期望,为什么我们没有类方法作为函数,不是每次我们声明一个新方法时我们都必须添加类型,并且我更喜欢定义类型的方法,然后在必要时进行调整,这就是我所说的函数示例,这是打字稿的限制吗?
-
是的,这是一个限制;请参阅下面我的答案以及“一个当前限制”开头的部分,以及链接的 GitHub 问题。
标签: javascript typescript types typescript-typings