Typescript 限制接口';s键类型转换为另一个接口的键类型';s值
描述我试图做的事情,但本质上我试图将一个对象的可能键限制为另一个对象的值Typescript 限制接口';s键类型转换为另一个接口的键类型';s值,typescript,Typescript,描述我试图做的事情,但本质上我试图将一个对象的可能键限制为另一个对象的值 这可能吗?我能找到的最接近的就是这个 type accessor=“name”|“firstname” 接口IData{ 标题:字符串; 存取器:存取器; } 类型ICell=记录 在TypeScript中,无法根据运行时值定义类型,因为所有类型都将在运行时删除。你所要求的是完全不可能的 考虑一下:如果这个对象是从一个返回随机值的web服务器上获取的,该怎么办?编译是如何工作的?您需要连接到internet吗?由于没有运行
这可能吗?我能找到的最接近的就是这个
type accessor=“name”|“firstname”
接口IData{
标题:字符串;
存取器:存取器;
}
类型ICell=记录
在TypeScript中,无法根据运行时值定义类型,因为所有类型都将在运行时删除。你所要求的是完全不可能的
考虑一下:如果这个对象是从一个返回随机值的web服务器上获取的,该怎么办?编译是如何工作的?您需要连接到internet吗?由于没有运行时类型检查,它根本不起作用
要在运行时实现这一点,如您所愿,您可以使用普通javascript。例如:
const accessors = data.map(o => o.accessor);
for (const cell of cells) {
for (const key in cell) {
if (!accessors.includes(key)) {
// throw a runtime error
throw new Error("This key is not a valid accessor!");
}
}
}
如果您知道编译时IData
的类型,就可以这样做。因此,您需要以下几点:
const data = [
{
title: "First name",
accessor: "firstname",
},
{
title: "Last name",
accessor: "surname",
}
] as const
type Accessors = typeof data[number]["accessor"]
type ICell = Record<Accessors, string>
const cells: ICell[] = [
{
firstname: "Davy",
surname: "James"
},
{
firstname: "Billy",
surname: "Cricket"
}
]
const数据=[
{
标题:“名字”,
访问者:“名字”,
},
{
标题:“姓氏”,
访问者:“姓氏”,
}
]常量
类型访问器=数据类型[编号][“访问器”]
类型ICell=记录
常量单元格:ICell[]=[
{
名字:“戴维”,
姓:“詹姆斯”
},
{
名字:“比利”,
姓:“蟋蟀”
}
]
如果您不知道编译时
数据的结构,就像其他答案所指出的那样,您不能这样做。此外(像任何其他对象一样),您必须检查在运行时创建的任何其他数据是否符合ICell
数据类型,如果您正试图这样做,您实际上无法在运行时检查它。谢谢Klas,不幸的是,我不知道访问器的值是什么,因为我使用泛型,所以您的解决方案不起作用,您是说accessor
的值是在运行时任意给定的?我不认为你可以把类型建立在这个基础上。TypeScript只能作用于编译时信息(因为它仅在编译期间处于活动状态)