Json 如何动态扩展TypeScript中字符串/对象的功能?
我正在开发一些本地化模块,为此我启用了TypesScript Json模块,目前我正在尝试实现以下用途: base.json: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"
{
"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我想你是对的,我想知道哪种输出最容易处理,因为我需要将整个对象路径映射到一个类型