Vue3+TypeScript 对象字面量如何使用对象原型方法

刚用TS,实在是搞不懂,对象字面量的形式申明对象后,怎么使用对象原型上的属性和方法呀?

const obj = {
 name: 'ts',
 age: '5'
}
obj.hasOwnProperty('name') //obj上没有hasOwerProperty方法

我该怎么做才能使用hasOwnProperty方法?
请大佬指点,感谢~

补充一下内容
项目中使用的Vue3+TS+ESlint检查,我看了提示,应该是ESlint的检查提示的报错:
image.png

我在纯粹的TS项目中试了一下,确实可以使用hasOwnProperty方法。

eslint的配置如下:

  "eslintConfig": {
    "root": true,
    "env": {
      "browser": true,
      "node": true,
      "es6": true
    },
    "extends": [
      "plugin:vue/vue3-essential",
      "eslint:recommended",
      "@vue/typescript/recommended",
      "@vue/prettier",
      "@vue/prettier/@typescript-eslint"
    ],
    "parserOptions": {
      "ecmaVersion": 2020
    },
    "rules": {
      "prettier/prettier": [
        0,
        {
          "useTabs": true
        }
      ]
    }
  },

看了ESlint的文档,对Object.prototypes做了限制
image.png
地址:https://eslint.org/docs/rules...

阅读 5.1k
3 个回答

你需要显示的定义obj的类型:

const obj: Object = {
 name: 'ts',
 age: '5'
}

没啥问题啊……感觉是你配置或者 TS 版本的问题呢……贴上来看看?

image.png

感谢上面两位大佬的帮助,最初是我描述问题不清楚,我以为是TS自身的语法问题,具有误导性。
后面我又看了项目的报错信息,是eslint的提示,然后看了eslint的官网,对原型对象上的方法默认是禁用的。

image.png

官网地址:https://eslint.org/docs/rules...

可以如下配置,启用Object.prototypes原型对象上的属性:

    "rules": {
        "no-prototype-builtins":"off"
    }

编辑器不提示这次有错误了。但是编译的时候,还是报错了,看了eslint是直接禁止这样使用的。

error: Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins

还是用call来改变this指向吧。

——————————————————————————
补充:

提出这个问题的根本原因是,我是想用TS的hasOwnProperty来检查某个对象上是否有某个属性。但是在TS中,即使使用了call

      const obj = {
        name: 'ts'        
      }
      const code = 'name' || 'age';
      const flag = Object.prototype.hasOwnProperty.call(obj, code)
      if (flag) {
          alert(obj[code]) // 即使flag是true,此处还是报错
      } else {
          alert(`未知code码错误:${code}`)
      }

这里有一篇文章,关于TS中,如果使用hasOwnProperty,地址:https://fettblog.eu/typescrip...

原文内容如下:

TypeScript 的控制流分析可以让你从更广泛的类型缩小到更狭窄的类型:

function print(msg: any) {
  if(typeof msg === 'string') {
    // We know msg is a string
    console.log(msg.toUpperCase()) // 👍
  } else if (typeof msg === 'number') {
    // I know msg is a number
    console.log(msg.toFixed(2)) // 👍
  }
}

这是 JavaScript 中的类型安全检查,TypeScript 从中受益。但是,在撰写本文时,在某些情况下,TypeScript需要我们提供更多帮助。

假设您有一个 JavaScript 对象,您不知道某个属性是否存在。对象可能是any或unknown。在 JavaScript 中,你会检查这样的属性:


if(typeof obj === 'object' && 'prop' in obj) {
  //it's safe to access obj.prop
  console.assert(typeof obj.prop !== 'undefined')
  // But TS doesn't know :-(
}

if(typeof obj === 'object' && obj.hasOwnProperty('prop')) {
  //it's safe to access obj.prop
  console.assert(typeof obj.prop !== 'undefined') 
  // But TS doesn't know :-(
}

目前,TypeScript 无法obj使用prop. 尽管这适用于 JavaScript。

但是,我们可以编写一个小辅助函数来获得正确的类型:

function hasOwnProperty<X extends Record<string, unknown>, Y extends PropertyKey>
  (obj: X, prop: Y): obj is X & Record<Y, unknown> {
  return obj.hasOwnProperty(prop)
}

如果您不想知道这是如何工作的,请复制它并感到高兴。如果你想知道更多,让我们看看发生了什么:

1、我们的hasOwnProperty函数有两个泛型:
X extends {} 确保我们只在对象上使用这个方法
Y extends PropertyKey确保密钥是string | number | symbol. PropertyKey是内置类型。
2、没有必要明确定义泛型,它们是通过使用推断出来的。
3、(obj: X, prop: Y): 我们要检查是否prop是一个属性键obj
4、返回类型是一个类型谓词。如果方法返回true,我们可以重新输入我们的任何参数。在这种情况下,我们说 ourobj是原始对象,其交集类型为Record<Y, unknown>,最后一块将新找到的属性添加到obj并将其设置为unknown
在使用中,hasOwnProperty是这样工作的:
// person is an object
if(typeof person === 'object' 
  // person = { } & Record<'name', unknown>
  // = { } & { name: 'unknown'}
  && hasOwnProperty(person, 'name') 
  // yes! name now exists in person 👍
  && typeof person.name === 'string' 
  ) {
    // do something with person.name, which is a string
  }

就是这样!一个可爱的小帮手,可以让 TypeScript 更好地理解你的代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进