[英]Typescript: Problem with generic Parameter/ReturnType and string Enums
我目前尝试为以下简化的 function 添加正确的类型:
getProperty(property:string):any
我的目标是能够将属性参数作为string
或string enum
传递,并为其获取正确的返回类型。
为此,我创建了一个新的string enum
属性:
enum Property {
ENABLED = 'enabled',
SIZE = 'size'
}
generic type
PropertyType:
type PropertyType < T > =
T extends Property.ENABLED ? boolean :
T extends Property.SIZE ? number : any;
并将 function 签名更改为:
getProperty<T extends Property>(property : T) : PropertyType<T>
如果我用新的string enum
调用 function ,这将非常有效:
const enabled: boolean = getProperty(Property.ENABLED);
但是,如果我用一个简单的字符串(向后兼容所需)调用 function,如下所示:
const enabled: boolean = getProperty("enabled");
我收到以下错误:
Argument of type '"enabled"' is not assignable to parameter of type 'Property'.(2345)
有没有什么好方法可以支持两种方式( string
和string enum
)来传递属性参数?
我的例子也可以在这里找到: Typescript Playground
您可以重载function 或将getProperty
的类型参数设置为联合类型。
超载:
function getProperty(property: string): any;
function getProperty<T extends Property>(property : T) : PropertyType<T>
{
return store[property];
}
工会类型:
function getProperty<T extends Property | string>(property : T) : PropertyType<T>
{
return store[property];
}
完整代码:
//Example Value store
const store: { [key: string]: any } = {
"enabled": true,
"size": 4
};
//--------------------------------------------------------------------------
//String Enum Property
enum Property {
ENABLED = 'enabled',
SIZE = 'size'
}
//--------------------------------------------------------------------------
//Property Types
type PropertyType < T > =
T extends Property.ENABLED ? boolean :
T extends Property.SIZE ? number : any;
//--------------------------------------------------------------------------
// Generic getProperty function
function getProperty<T extends Property | string>(property : T) : PropertyType<T>
{
return store[property];
}
//--------------------------------------------------------------------------
const enabled0: boolean = getProperty(Property.ENABLED);
const enabled1: boolean = getProperty('enabled');
另一种方法是简单地选择一个不同的 function 名称,因为您不会从重载中获得任何类型安全。 Imo 这是保持向后兼容的更好选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.