使用TypeScript为带有前缀的JSON文件键定义类型

使用TypeScript为带有前缀的JSON文件键定义类型,json,typescript,object,Json,Typescript,Object,我正在将一个JSON文件导入我的TypeScript程序,如下所示:(我在我的tsconfig.JSON中启用了resolveJsonModule) 从“/sample.json”导入数据; 幸运的是,我注意到从JSON文件接收到的对象是强类型的。然后,我编写了一个函数,该函数基于一个参数访问所述JSON对象的某个键: export const get=(key:keyof typeof data):void=>{ log(数据[key]);//示例代码 }; 这与预期的一样,我的函数的使用

我正在将一个JSON文件导入我的TypeScript程序,如下所示:(我在我的
tsconfig.JSON
中启用了
resolveJsonModule

从“/sample.json”导入数据;
幸运的是,我注意到从JSON文件接收到的对象是强类型的。然后,我编写了一个函数,该函数基于一个参数访问所述JSON对象的某个键:

export const get=(key:keyof typeof data):void=>{
log(数据[key]);//示例代码
};
这与预期的一样,我的函数的使用者可以知道JSON文件中接受/包含哪些值。问题来了:我希望我的函数的使用者只能访问我加了前缀的某些键(在下面的示例中,前缀是
prefix\uuu
):

export const get=(key:keyof typeof data):void=>{
log(数据[`prefix_${key}`];
};
如何更改类型定义以使其仍然有效?

在TypeScript 4.3之前 从TypeScript 4.2开始,没有办法在使用字符串函数的情况下执行条件类型,因此我不知道如何指定以前缀开头的键

我能想到的最好方法是使用从json文件的所有可能属性和派生类型的交集创建一个新类型

在下面的示例中,我导入了两个示例json文件。接下来,我指定要保留在字符串文本类型中的所有可能键。然后使用Pick从两个文件创建两种类型。为了使“拾取”工作,我必须在第二个参数中传递一个类型,该参数是派生文件类型和PublicPrefix类型的键的交点

import data1 from './sample1.json'; // { x: 1, prefix_A: 2, prefix_B: 3 }
import data2 from './sample2.json'; // { y: 1, prefix_B: 2, prefix_C: 3 }
type PublicPrefix = 'prefix_A' | 'prefix_B' | 'prefix_C';
export type Data1 = Pick<typeof data1, keyof typeof data1 & PublicPrefix>;
// Data1 = { prefix_A: number, prefix_B: number }
export type Data2 = Pick<typeof data2, keyof typeof data2 & PublicPrefix>;
// Data2 = { prefix_B: number, prefix_C: number }
import data from './sample.json';
type PublicPrefix = `prefix_${string}`;
export type Data1 = Pick<typeof data, keyof typeof data & PublicPrefix>;