Isn\'t it possible to set the type of a parameter to an Enum? Like this:
private getRandomElementOfEnum(e : enum):string{
var length:number = Object.
Tested on TypeScript 3.9.7
type EnumTypeString =
{ [key in string]: TEnum | string; }
type EnumTypeNumber =
{ [key in string]: TEnum | number; }
| { [key in number]: string; }
type EnumType =
(TEnum extends string ? EnumTypeString : never)
| (TEnum extends number ? EnumTypeNumber : never)
type EnumOf = TEnumType extends EnumType
? U
: never
function forEachEnum(
enumType: EnumType,
callback: (value: TEnum, key: string) => boolean|void,
) {
for (let key in enumType) {
if (Object.prototype.hasOwnProperty.call(enumType, key) && isNaN(Number(key))) {
const value = enumType[key] as any
if (callback(value, key)) {
return
}
}
}
}
EnumOf:
function forEachEnum2(
enumType: TEnumType,
callback: (value: EnumOf, key: string) => boolean|void,
) {
for (let key in enumType) {
if (Object.prototype.hasOwnProperty.call(enumType, key) && isNaN(Number(key))) {
const value = enumType[key] as any
if (callback(value, key)) {
return
}
}
}
}
enum EnumAsString {
Value1 = 'value 1',
Value2 = 'value 2',
}
enum EnumAsNumber {
Value1 = 1,
Value2 = 2,
}
// Error
let sn: EnumType = EnumAsNumber
// Correct
let ns: EnumType = EnumAsString // I have not found a solution for the error here
let nn: EnumType = EnumAsNumber
let Nn: EnumType = EnumAsNumber
let ss: EnumType = EnumAsString
let Ss: EnumType = EnumAsString
forEachEnum(EnumAsString, value => {
let e: EnumAsString = value
let s: string = value
let n: number = value // Error
})
forEachEnum(EnumAsNumber, value => {
let e: EnumAsNumber = value
let s: string = value // Error
let n: number = value
})
forEachEnum2(EnumAsString, value => {
let e: EnumAsString = value
let s: string = value
let n: number = value // Error
})
forEachEnum2(EnumAsNumber, value => {
let e: EnumAsNumber = value
let s: string = value // Error
let n: number = value
})