【发布时间】:2023-03-16 11:47:01
【问题描述】:
我有以下类工厂pickSomething,它根据来自ClassMap 的传入键创建一个类型:
class A {
keya = "a" as const;
}
class B {
keyb = "b" as const;
}
type ClassMap = {
a: A
b: B
}
const pickSomething = <K extends keyof ClassMap>(key: K): ClassMap[K] => {
switch (key) {
case 'a':
return new A(); // Error: A is not assignable to A & B
case 'b':
return new B(); // Error: B is not assignable to A & B
}
throw new Error();
}
// It works fine externally
const a = pickSomething('a').keya;
const b = pickSomething('b').keyb;
它在外部运行良好(正如您从const a = pickSomething('a').keya; 看到的那样)。这意味着外部ClassMap[K] 映射到正确的实例(A 或B 取决于传入的key)。但是在内部,我在每个 return 语句上都收到一个错误。 TypeScript 期望 ClassMap[K] 表示 A & B。有没有办法用更好的类型注释来解决它(不诉诸类型断言)?
【问题讨论】:
-
如果你必须问,可能没有。但我们可能会找到一些关于 TypeScript 问题跟踪器的报告……
-
这不是this problem的又一个案例吗? TypeScript 不知道
K没有实例化为'a' | 'b'。 -
这是
K可能比单个键更宽的情况。理论上你可以调用pickSomething<'a' | 'b'>('b')并且你的返回类型是无效的。在实践中,你不会那样做。所以只需使用断言。 -
我想重载会有所帮助,但这不会使用
ClassMap
标签: javascript typescript