Enum as Parameter in TypeScript

后端 未结 9 1789
故里飘歌
故里飘歌 2020-12-01 13:18

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.         


        
9条回答
  •  不知归路
    2020-12-01 14:07

    Tested on TypeScript 3.9.7

    Solution

    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
    

    Usage

    EnumType:
    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
                }
            }
        }
    }
    

    Tests

    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
    })
    

提交回复
热议问题