【发布时间】:2021-08-25 15:24:25
【问题描述】:
我试图理解一些对我来说看起来很明显的东西,但 Typescript 似乎不允许所有严格的标志都打开(当然有很好的理由)。让我告诉你:
我们都知道:
export interface Basic {
value: "foo" | "bar" | "baz";
}
export interface Constraint extends Basic {
value: "foo";
}
有效。但更令人惊讶的是(至少对我而言):
export interface WithFunctionsBasic {
value: (t: "foo" | "bar" | "baz") => void;
}
export interface WithFunctionsConstraint extends WithFunctionsBasic { // WithFunctionsConstraint extends incorrectly WithFunctionsBasic
value: (t: "foo") => void;
}
没有。
我们可以将其设为 Generic 以允许我们进行如下行为:
export interface WithFunctionsParametric<T extends Basic> {
value: (t: T["value"]) => void;
}
const variableConstraint: WithFunctionsParametric<Constraint> = { value: (t: "foo") => {} };
const variableBasic: WithFunctionsParametric<Basic> = { value: (t: "foo" | "bar" | "baz") => {} };
两者都有效。但这有点棘手,因为尽管 Constraint 扩展了 Basic:
const variableConstraint: WithFunctionsParametric<Constraint> = { value: (t: "foo") => {} };
const variableBasic: WithFunctionsParametric<Basic> = variableConstraint; // Not Working
据我了解,如果 Constraint 扩展 Basic(就是这种情况),后者应该可以工作。有人可以解释一下为什么吗?
【问题讨论】:
标签: typescript typescript-generics