代码之家  ›  专栏  ›  技术社区  ›  Ruan Mendes

强制对象中的对象与typescript中的类型相同

  •  1
  • Ruan Mendes  · 技术社区  · 8 年前

    我需要创建一个常量列表,例如,

    const Days = {
      YESTERDAY: -1,
      TODAY: 0,
      TOMORROW: 1,
    }
    

    我想要一种方法来约束中所有属性的类型 Days ,也就是说,如果我添加一个属性 BAD_DAY: true ,我想让编译器投诉。

    我首先创造了

    type ObjectOf<T> = {[k: string]: T};
    
    const Days: ObjectOf<number> = {
       A: true;
    }
    

    这确实给了我一个错误,但是,当我在 Days. .我理解这是因为我把它变成了一个键控对象类型。

    我可以像第一个示例那样完成代码,也可以使用编译器帮助完成第二个示例。我可以吃蛋糕吗?我想我想要一些类似Java枚举的东西,从某种意义上说,它是同一类型的对象的已知列表。

    enum Days{
       Today("SUN"), MONDAY("MON"), TUESDAY("TUES"), WEDNESDAY("WED"),
       THURSDAY("THURS"), FRIDAY("FRI"), SATURDAY("SAT");
       private String abbreviation;
       public String getAbbreviation() {
           return this.abbreviation;
       }
       Days(String abbreviation) {
          this.abbreviation = abbreviation;
       }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Titian Cernicova-Dragomir    8 年前

    把你的蛋糕也吃了。关于 const 您需要一个通用的助手函数。helper函数将强制执行约束,但推断传入的对象文本的真实类型:

    type ObjectOf<T> = {[k: string]: T};
    function createObjectOfNumber<T extends ObjectOf<number>>(v:T){
        return v;
    }
    const Days = createObjectOfNumber({
       A: 1
       // B: true // would be an error
    });
    Days.A // ok
    

    或更通用的版本:

    function createObjectOf<TValue>(){
        return function<T extends ObjectOf<TValue>>(v:T){
            return v;
        }
    }
    const Days = createObjectOf<number>()({
       A: 1
       // B: true // would be an error
    });
    Days.A // ok
    

    如果您想要像Java枚举之类的东西,在类型化脚本中没有语言支持,但您可以模拟它们,参见 this answer