首页 > 解决方案 > 如何获取声明为字符串/数字/日期函数的对象字段类型?

问题描述

我想获取具有字符串/日期/数字函数值的对象字段的类型。使用 typeof 运算符时,它返回函数。但我想确切地知道它是哪种类型的功能。有什么办法可以得到吗?

const obj = {
  key: String,
  key1: Number,
  key2: [String]
}

console.log(typeof obj.key) // returns function but i expect it to return string 
console.log(typeof obj.key1) // returns function but i expect it to return number
console.log(typeof obj.key2) // returns function but i expect it to return array of string

标签: javascript

解决方案


您可以查看该prototype.constructor.name属性以确定它是 aString还是Number.

const obj = {
  key: String,
  key2: Number,
  key3: Date,
}

console.log('key', obj.key.prototype.constructor.name);
console.log('key2', obj.key2.prototype.constructor.name);
console.log('key3', obj.key3.prototype.constructor.name);

console.log(
  'is string?', 
  obj.key.prototype.constructor.name.toLowerCase() === 'string'
);
console.log(
  'is number?',
  obj.key2.prototype.constructor.name.toLowerCase() === 'number'
);
console.log(
  'is date?',
  obj.key3.prototype.constructor.name.toLowerCase() === 'date'
);

这会获取对象的构造函数的名称,因此它将与任何命名函数一起使用:

function MyCustomType() {
  //
}
const obj = { custom: MyCustomType }

console.log(obj.custom.prototype.constructor.name);

编辑:

const obj = {
  key: String,
  key1: Number,
  key2: [String],
  key3: [],
};

function getType(arg) {
  var isArray = arg instanceof Array;
  
  if (isArray && arg.length > 0) {
    // very naive approach
    var typeofFirstItem = arg[0].prototype.constructor.name;
    
    return "Array<" + typeofFirstItem +">";
  }
  if (isArray) {
    return "Array";
  }
  return arg.prototype.constructor.name;
}

console.log(getType(obj.key))
console.log(getType(obj.key1))
console.log(getType(obj.key2))
console.log(getType(obj.key3))


推荐阅读