在这里插入图片描述
问题:对对象的类型进行限制后,通过获取key访问属性值报错,如上图

import {ref} from 'vue';
interface Article {
  name: string;
  title: string;
  content: string;
};
const form = ref<Article>({
	name:'',
	title:'',
	content:''
});
const vertify = ()=>{
    Object.keys(form.value).forEach((key)=>{
        if(form.value[key]){ //报错
            return true;
        }
    })
    return false;
}

解决方法1: 索引签名
在 TypeScript 中,如果你想使用字符串来索引一个对象,该对象的类型必须具有字符串索引签名,这意味着你需要明确告诉 TypeScript,这个对象可以接受字符串键并返回某种类型的值。

interface Article {
  [key: string]: string; // 添加索引签名
  name: string;
  title: string;
  content: string;
};

解决方法2: keyof+类型推断

const vertify = ()=>{
    Object.keys(form.value).forEach((key)=>{
        if(form.value[key as keyof Article]){ //报错
            return true;
        }
    })
    return false;
}

补充:keyof用法

在TypeScript中,keyof是一个关键字,用于获取对象类型(包括接口)的所有键的联合类型。它通常用于以下情况:

  1. 获取对象的所有键:
type Person = {
  name: string;
  age: number;
  address: string;
};

type KeysOfPerson = keyof Person;
// KeysOfPerson 的类型为 "name" | "age" | "address"
  1. 用于访问对象的属性:
function getProperty(obj: Person, key: keyof Person) {
  return obj[key];
}

const person: Person = {
  name: "John",
  age: 30,
  address: "123 Main St"
};

const name = getProperty(person, "name"); // 正确
const invalidKey = getProperty(person, "email"); // 错误,"email" 不是 Person 的有效键
  1. 限制函数参数的类型:
function updatePersonField(key: keyof Person, value: string) {
  // 在这里,key 只能是 "name"、"age" 或 "address"
}

updatePersonField("name", "Alice"); // 正确
updatePersonField("email", "alice@example.com"); // 错误,"email" 不是 Person 的有效键
  1. 遍历对象的键:
type Person = {
  name: string;
  age: number;
  address: string;
};

const person: Person = {
  name: "John",
  age: 30,
  address: "123 Main St"
};

for (const key in person) {
  if (key === "name") {
    const value = person[key];
    console.log(`${key}: ${value}`);
  }
}

keyof 是一种强大的工具,用于在编译时捕获对象类型的键信息,从而提高类型安全性和代码的可维护性。

Logo

新一代开源开发者平台 GitCode,通过集成代码托管服务、代码仓库以及可信赖的开源组件库,让开发者可以在云端进行代码托管和开发。旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐