Enum flags in JavaScript

前端 未结 6 447
夕颜
夕颜 2021-01-30 08:23

I need to emulate enum type in Javascript and approach seems pretty straight forward:

var MyEnum = {Left = 1; Right = 2; Top = 4; Bottom = 8}

N

6条回答
  •  抹茶落季
    2021-01-30 09:15

    There is my implementation in typescript:

    export class FlagEnumService {
    
        constructor(private value: number = 0) {
        }
    
        public get() {
            return this.value;
        }
    
        public set(value: number): this {
            this.value = value;
            return this;
        }
    
        public has(key: number): boolean {
            return !!(this.value & key);
        }
    
        public add(key: number): this {
            this.value |= key;
            return this;
        }
    
        public delete(key: number): this {
            this.value &= ~key;
            return this;
        }
    
        public toggle(key: number): this {
            this.has(key) ? this.delete(key) : this.add(key);
            return this;
        }
    }
    

    And tests for clarification

    import { FlagEnumService } from './flag-enum.service';
    
    enum Test {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        Four = 8
    }
    
    describe('FlagEnumService', () => {
        let service: FlagEnumService;
        beforeEach(() => service = new FlagEnumService());
    
        it('should create with initial value', () => {
            service = new FlagEnumService(Test.First);
            expect(service.get()).toBe(Test.First);
        });
    
        it('should return true if has flag', () => {
            service = new FlagEnumService(Test.First);
            expect(service.has(Test.First)).toBe(true);
        });
    
        it('should return false if doesn\'t have flag', () => {
            service = new FlagEnumService(Test.First);
            expect(service.has(Test.Second)).toBe(false);
        });
    
        it('should add', () => {
            expect(service.add(Test.First).add(Test.Second).get()).toBe(Test.First + Test.Second);
        });
    
        it('should not add the same value twice', () => {
            expect(service.add(Test.First).add(Test.First).get()).toBe(Test.First);
        });
    
        it('should remove', () => {
            expect(
                service
                    .add(Test.First)
                    .add(Test.Second)
                    .delete(Test.Second)
                    .get()
            )
                .toBe(Test.First);
        });
    
        it('should return 0 when add then remove the same value', () => {
            expect(service.add(Test.First).delete(Test.First).get()).toBe(0);
        });
    
        it('should not remove not added values', () => {
            expect(service.add(Test.First).delete(Test.Second).get()).toBe(Test.First);
        });
    });
    

提交回复
热议问题