难道不能将参数的类型设置为枚举吗?这样地:

private getRandomElementOfEnum(e : enum):string{
    var length:number = Object.keys(e).length;
    return e[Math.floor((Math.random() * length)+1)];
}

编译引发以下错误:

应为参数表达式.(1135)

显然,每件事都没问题:

private getRandomElementOfEnum(e : any):string{
    var length:number = Object.keys(e).length;
    return e[Math.floor((Math.random() * length)+1)];
}

这个代码很好用.但它并没有那么优雅和安全.

是否有可能将枚举定义为参数,或者有一些解决方法?

推荐答案

无法确保参数是枚举,因为TS中的枚举不是从公共祖先或接口继承的.

TypeScript带来了静态分析.您的代码使用Object.keyse[dynamicKey]的动态编程.对于动态代码,any型比较方便.

你的代码有问题:length()不存在,e[Math.floor((Math.random() * length)+1)]返回字符串或整数,the enumeration values can be manually set

以下是一个建议:

function getRandomElementOfEnum<E>(e: any): E {
    var keys = Object.keys(e),
        index = Math.floor(Math.random() * keys.length),
        k = keys[index];
    if (typeof e[k] === 'number')
        return <any>e[k];
    return <any>parseInt(k, 10);
}

function display(a: Color) {
    console.log(a);
}

enum Color { Blue, Green };
display(getRandomElementOfEnum<Color>(Color));

理想情况下,参数类型any应该替换为typeof E,但编译器(TS 1.5)无法理解这种语法.

Typescript相关问答推荐

类型脚本强制泛型类型安全

当我点击外部按钮时,如何打开Html Select 选项菜单?

使用ngrok解析Angular 时出现HTTP故障

如果请求是流,如何等待所有响应块(Axios)

有没有办法解决这个问题,类型和IntrinsicAttributes类型没有相同的属性?

如何推断计算逻辑的类型

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

我可以以这样一种方式键入对象,只允许它的键作为它的值吗?

如何创建一家Reduxstore ?

是否将自动导入样式从`~/目录/文件`改为`@/目录/文件`?

TypeScrip泛型类未提供预期的类型错误

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

如何将对象数组中的键映射到另一种对象类型的键?

17个Angular 的延迟观察.如何在模板中转义@符号?

使用Type脚本更新对象属性

如何在打字角react 式中补齐表格组

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因

类型分布在第一个泛型上,但不分布在第二个泛型上

我应该使用服务方法(依赖于可观察的)在组件中进行计算吗?

在对象类型的类型别名中,属性是用分号 (;) 还是逗号 (,) 分隔的?