繁体   English   中英

Typescript:通用参数/ReturnType 和字符串枚举有问题

[英]Typescript: Problem with generic Parameter/ReturnType and string Enums

我目前尝试为以下简化的 function 添加正确的类型:

getProperty(property:string):any

我的目标是能够将属性参数作为stringstring 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)

有没有什么好方法可以支持两种方式( stringstring 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM