在Typescript中,我希望根据函数的参数确定其返回类型。在下面的示例中,如果使用ComponentKey.A
类型的参数调用getPropsForComponentKey
,则其返回类型应为AProps
。我应该能够使用控制流分析来防止返回具有不兼容类型的值。然而,我不确定如何描述这个函数的类型,以便在传入'A'时返回AProps
。
我尝试使用泛型类型T
,并使用它索引到索引访问类型PropTypesForComponentKey
,以便返回类型将解析为AProps
或BProps
,这取决于传入函数的内容。编译器错误指示AProps
不可赋值给PropTypesForComponentKey[T]
。
TSPlayground
type AProps = {
value: number;
}
type BProps = {
description: string;
}
enum ComponentKey {
A = 'A',
B = 'B',
}
type PropTypesForComponentKey = {
[ComponentKey.A]: AProps;
[ComponentKey.B]: BProps;
}
// this object enforces the mapping between key and value types
const propsForComponentKey: PropTypesForComponentKey = {
[ComponentKey.A]: { value: 3 },
[ComponentKey.B]: { description: 'foo' },
}
// we know that aProp is of type AProps when we use 'A' as an index into propsForComponentKey
const aProp = propsForComponentKey['A'];
// How do I enforce the return type of this function?
function getPropsForComponentKey<T extends ComponentKey>(componentKey: T): null | PropTypesForComponentKey[T] {
switch(componentKey) {
case ComponentKey.A:
return { value: 3 } as AProps;
case ComponentKey.B:
return { description: 'foo' };
}
return null;
}
1条答案
按热度按时间xqk2d5yq1#
我没有设法用控制流分析来得到这个行为。尽管,你用函数重载得到了同样的结果。这有点冗长,但是完成了任务。
Playground