有没有一种方法可以将所有深层嵌套对象的值类型都定义为字符串类型?

时间:2019-05-14 15:02:11

标签: javascript flowtype

假定此嵌套对象:

const nestedObj = {
  definition: {
    name: 'Mike',
    prop1: {
      value1: 'This is a string',
      prop2: {
        value2: 'String again',
      },
    },
  },
};

是否有谨慎的方法来做类似的事情:

type NestedObj = {
  definition: AllValuesAreOfTypeString
}

1 个答案:

答案 0 :(得分:1)

您正在寻找this吗?

否则,通过编写您已经拥有的确切代码,您为nestedObj指定了以下类型:

{
  definition: {
    name: string,
    prop1: {
      value1: string,
      prop2: {
        value2: string,
      },
    },
  },
}

例如,如果您提取嵌套属性之一:

const nestedProp = nestedObj.definition.prop1.value1;

它将正确键入为string

(nestedProp: string);

如果您尝试将深度嵌套的属性设置为其他类型:

nestedObj.definition.prop1.value1 = 1;

您将收到类型错误:

  

由于数字[1]与字符串[2]不兼容,因此无法将1分配给nestedObj.definition.prop1.value1

您也不能在对象上设置其他道具,因为它是密封的:

nestedObj.undefinedProp = 'test';

最后,您实际上可以通过执行以下操作来保存nestedObj的类型:

type NestObject = typeof nestedObj;

例如,您然后可以在其他对象上使用此类型:

const nestedObj2: NestedObject = {
  definition: {
    name: 'test',
    prop1: {
      value1: 'value1',
      prop2: {
        value2: 'test',
      }
    },
  },
};

因此,如果您以与nestedObj2不匹配的方式定义nestedObj1,则会出现错误:


const nestedObj3: NestedObject = {
  definition: {
    name: 1, // Error!
    // Cannot assign object literal to `nestedObj3` because 
    // number [1] is incompatible with string [2] in property 
    // `definition.name`.
    prop1: {
      value1: 'value1',
      prop2: {
        value2: 'test',
      }
    },
  },
};

Try Flow

编辑:添加了第一个示例,因为我可能在第一次就误解了这个问题。