今天在学习ts的时候看到了这么一个表达式:
const arr:[string|number] = [1,'hello']
console.log(typeof arr['length'])
//输出结果为 2
于是我就突发奇想,既然可以用索引签名获取属性的类型,那我理论上也可以通过这种方式获取这个arr数组原型链上的所有属性类型,比如Array的sort方法:
const arr:[string|number] = [1,'hello']
console.log(typeof arr['sort'])
//输出结果为 function
既然数组可以,那么同为引用类型的对象是否也可以?于是我创建了一个新对象user,读取user对象中的defineProperty方法类型,如果正确输出的话,终端显示的应该是function,结果却是这样的:
interface IUser {
name:string
}
const user:IUser = {
name:'xiaozheng'
}
// 输出user对象中的defineProperty方法
console.log(typeof user['defineProperty'])
//输出结果为 undefined
出乎我意料,user对象中的defineProperty方法类型未定义。这时候依靠大佬协助我才明白:
Object本身是一个基类,Object其中的绝大部分方法和属性都是静态的,只有Object派生出的类和Object本身才可访问这些静态属性和方法,也就是说这些属性和方法无法被外界访问和使用,里面就包括defineProperty。所以如果直接用Object类对象访问defineProperty方法类型,就会有正确的返回值:
console.log(typeof Object['defineProperty'])
//输出结果为 function