Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 限制接口';s键类型转换为另一个接口的键类型';s值_Typescript - Fatal编程技术网

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只能作用于编译时信息(因为它仅在编译期间处于活动状态)