代码之家  ›  专栏  ›  技术社区  ›  Jackson Vaughan

如何访问环回模型属性类型?(模型.定义.属性.类型)

  •  0
  • Jackson Vaughan  · 技术社区  · 6 年前

    如何从模型扩展文件(model.js)中访问模型属性类型?

    如果我尝试访问model.definition.properties,我可以看到给定属性的以下内容:

    { type: [Function: String],
    [1]   required: false,
    [1]   description: 'deal stage' }
    

    为什么类型被列为 [Function: String] 而不仅仅是“字符串”之类的?

    如果我跑 typeof(property.type) 它返回“函数”,但如果我运行 property.type() 它返回一个空字符串。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Miroslav BajtoÅ¡    6 年前

    免责声明:我是一个共同作者和目前的环回维护者。

    DR

    使用以下表达式获取作为字符串名称的属性类型。请注意,它只适用于可能的属性定义的子集(请参阅后面的内容),最明显的是它不支持数组。

    const type = typeof property.type === 'string' 
      ? property.type
      : property.type.modelName || property.type.name;
    

    长版

    环回允许以多种方式定义属性类型:

    1. 作为字符串名称,例如 {type: 'string', description: 'deal stage'} . 也可以使用模型名称作为类型,例如 {type: 'Customer'} .
    2. 作为类型构造函数,例如 {type: String, description: 'deal stage'} . 也可以使用模型构造函数作为类型,例如 {type: Customer} .
    3. 作为匿名模型的定义,例如 {type: {street: String, city: String, country: String}
    4. 作为数组类型。可以使用上面描述的三种方法(字符串名称、类型构造函数或匿名模型定义)中的任意一种来指定数组项的类型。

    请阅读我们的文档: LoopBack types

    为了更好地理解如何处理不同类型的属性定义,可以检查将环回模型模式转换为环回模式(类似于JSON模式)的环回Swagger中的代码:

    函数 getLdlTypeName 采用属性定义(稍微规范化为 buildFromLoopBackType )并将属性类型作为字符串名称返回。

    exports.getLdlTypeName = function(ldlType) {
      // Value "array" is a shortcut for `['any']`
      if (ldlType === 'array') {
        return ['any'];
      }
    
      if (typeof ldlType === 'string') {
        var arrayMatch = ldlType.match(/^\[(.*)\]$/);
        return arrayMatch ? [arrayMatch[1]] : ldlType;
      }
    
      if (typeof ldlType === 'function') {
        return ldlType.modelName || ldlType.name;
      }
    
      if (Array.isArray(ldlType)) {
        return ldlType;
      }
    
      if (typeof ldlType === 'object') {
        // Anonymous objects, they are allowed e.g. in accepts/returns definitions
        // TODO(bajtos) Build a named schema for this anonymous object
        return 'object';
      }
    
      if (ldlType === undefined) {
        return 'any';
      }
    
      var msg = g.f('Warning: unknown LDL type %j, using "{{any}}" instead', ldlType);
      console.error(msg);
      return 'any';
    };
    
        2
  •  0
  •   Jackson Vaughan    6 年前

    运行 typeof 在函数上返回类型。

    var type = typeof(property.type())

    var type 将是字符串、数字等。

    不知道为什么环回不返回类型本身,而不是函数。