Json 如何动态扩展TypeScript中字符串/对象的功能?

Json 如何动态扩展TypeScript中字符串/对象的功能?,json,typescript,typescript-typings,typescript-compiler-api,Json,Typescript,Typescript Typings,Typescript Compiler Api,我正在开发一些本地化模块,为此我启用了TypesScript Json模块,目前我正在尝试实现以下用途: base.json: { "base": "", "greeting": "{{name}}", "extras": { "array": ["{{city}}", 0] } } en.json/nl.json { "base": "hello", "greeting": "hello {{name}}", "extras": { "array"

我正在开发一些本地化模块,为此我启用了TypesScript Json模块,目前我正在尝试实现以下用途:

base.json:

{
  "base": "",
  "greeting": "{{name}}",
  "extras": {
    "array": ["{{city}}", 0]
  }
}
en.json/nl.json

{
  "base": "hello",
  "greeting": "hello {{name}}",
  "extras": {
    "array": ["I live in {{city}}", 7]
  }
}
我希望所有的文件都能实现这个基础,所以我做了以下工作

从“/locale/base.json”导入base;
从“/locale/en.json”导入en;
从“/locale/nl.json”导入nl;
类型语言=可用语言类型的键;
常量可用语言:记录={
EN
荷兰,
}作为常量;
导出常量setLanguage=(lang:T)=>{
返回可用语言[lang];
};
这是我工作的最低要求,但是我想得到这个用法:

const t=setLanguage(“en”)
t、 基地//你好
t、 问候语({name:“Daniell”})//你好,Daniell
t、 附加数组({城市:“我的城市”})/[“我住在我的城市”,7]
我想知道如何实现这样的目标,我需要一些帮助,特别是:

  • 如果我要从base.json提取胡须符号到它自己的接口来生成打字,我应该如何构造这些符号以将它们映射到每个路径,这是最好的方法吗
  • 我应该如何键入字符串/数组的接口?因为下面的例子不能给我任何智能感知
接口字符串{
(…args:any):any;
}

虽然无法获得预期插值参数的名称,但仍然可以获得正确的json形状(使用
--resolveJsonModule
标志)。 大概是

type RecursiveProxified<T> = {
  [K in keyof T]: T[K] extends string
    ? (...values) => string
    : T[K] extends Array<string | number>
    ? (...values) => Array<string | number>
    : T[K] extends {}
    ? RecursiveProxified<T[K]>
    : never
};
type RecursiveProxified={
[K in keyof T]:T[K]扩展字符串
?(…值)=>字符串
:T[K]扩展数组
?(…值)=>数组
:T[K]扩展{}
?递归代理
:从不
};
可以提供基本的类型检查和智能感知功能

const proxifyTranslations = <T>(translations: T): RecursiveProxified<T> => {
  // there should be actual implementation
  return translations as any; 
};

const availableLanguages = {
  en: json // json module
};

const setLanguage = (lang: keyof typeof availableLanguages) => {
  return proxifyTranslations(availableLanguages[lang]);
};

const t = setLanguage("en");

t.base(123); // string
t.extras.array(123); // Array<string | number>
constproxifytransfions=(translations:T):RecursiveProxified=>{
//应该有实际的执行
返回任何翻译;
};
常量可用语言={
en:json//json模块
};
const setLanguage=(lang:keyof-typeof-availableLanguages)=>{
返回proxifyTranslations(可用语言[lang]);
};
常量t=设置语言(“en”);
t、 基数(123);//一串
t、 附加数组(123);//排列

虽然无法获得预期插值参数的名称,但仍然可以获得正确的json形状(使用
--resolveJsonModule
标志)。 大概是

type RecursiveProxified<T> = {
  [K in keyof T]: T[K] extends string
    ? (...values) => string
    : T[K] extends Array<string | number>
    ? (...values) => Array<string | number>
    : T[K] extends {}
    ? RecursiveProxified<T[K]>
    : never
};
type RecursiveProxified={
[K in keyof T]:T[K]扩展字符串
?(…值)=>字符串
:T[K]扩展数组
?(…值)=>数组
:T[K]扩展{}
?递归代理
:从不
};
可以提供基本的类型检查和智能感知功能

const proxifyTranslations = <T>(translations: T): RecursiveProxified<T> => {
  // there should be actual implementation
  return translations as any; 
};

const availableLanguages = {
  en: json // json module
};

const setLanguage = (lang: keyof typeof availableLanguages) => {
  return proxifyTranslations(availableLanguages[lang]);
};

const t = setLanguage("en");

t.base(123); // string
t.extras.array(123); // Array<string | number>
constproxifytransfions=(translations:T):RecursiveProxified=>{
//应该有实际的执行
返回任何翻译;
};
常量可用语言={
en:json//json模块
};
const setLanguage=(lang:keyof-typeof-availableLanguages)=>{
返回proxifyTranslations(可用语言[lang]);
};
常量t=设置语言(“en”);
t、 基数(123);//一串
t、 附加数组(123);//排列

在JS中可以调用字符串、对象或数组。因此,在考虑获取IntelliSense之前,您需要有一个有效的解决方案。我不确定我是否理解这个问题,您是否试图从base.json文件中创建typescript类型?如果没有代码,我不确定这是否可行generation@Shlang使用代理是可能的,我更担心typings@BenWinding我想你是对的,我想知道什么样的输出最容易处理,因为我需要将整个对象路径映射到一个类型,你可以在JS中调用字符串、对象或数组。因此,在考虑获取IntelliSense之前,您需要有一个有效的解决方案。我不确定我是否理解这个问题,您是否试图从base.json文件中创建typescript类型?如果没有代码,我不确定这是否可行generation@Shlang使用代理是可能的,我更担心typings@BenWinding我想你是对的,我想知道哪种输出最容易处理,因为我需要将整个对象路径映射到一个类型