Typescript 如何基于另一种类型定义强类型映射
我卡住了,可能需要一些帮助,或者只是从外面看一看 我有这个密码。其主要思想是创建一个类型,该类型描述属性,并连接值类型(请参见类型Person)。然后将其转换为具有元数据的类映射(请参见常量映射)Typescript 如何基于另一种类型定义强类型映射,typescript,Typescript,我卡住了,可能需要一些帮助,或者只是从外面看一看 我有这个密码。其主要思想是创建一个类型,该类型描述属性,并连接值类型(请参见类型Person)。然后将其转换为具有元数据的类映射(请参见常量映射) type Person={ 名字:字符串; 年龄:人数; } 类型定义={ 值:T, 默认值:T } 类型PersonDefinitionMap={ [输入个人密码]:定义 } 常量映射:PersonDefinitionMap= { 年龄:{value:5,defaultValue:0}, 名字:{v
type Person={
名字:字符串;
年龄:人数;
}
类型定义={
值:T,
默认值:T
}
类型PersonDefinitionMap={
[输入个人密码]:定义
}
常量映射:PersonDefinitionMap=
{
年龄:{value:5,defaultValue:0},
名字:{value:'test',defaultValue:'unknown'}
};
它工作得很好,它迫使我填充所有属性,并且不允许我放置Person类型中未描述的内容。但它仍然有两个弱点:
- 我仍然可以输入错误的类型:
const-map:persondefinationmap=
{
年龄:{value:'我不是数字',默认值:0},
名字:{value:'test',defaultValue:'unknown'}
};
- 默认值不强制与值具有相同的类型:
const-map:persondefinationmap=
{
年龄:{value:1000,defaultValue:'轮到我忽略类型'},
名字:{value:'test',defaultValue:'unknown'}
};
我理解为什么会发生这种情况(我们对类型定义使用union,但我没有找到解决方法。关于如何解决这个问题有什么想法吗?可能吗?您需要将值的类型(而不是键的类型)传递到
定义
类型定义映射={
[key in keyof T]:定义
}
//嗯
常量映射:定义映射=
{
年龄:{value:5,defaultValue:0},
名字:{value:'test',defaultValue:'unknown'}
};
//错误如预期
常量映射2:定义映射=
{
年龄:{value:'我不是数字',默认值:0},
名字:{value:'test',defaultValue:'unknown'}
};
//错误如预期
常量映射3:定义映射=
{
年龄:{value:1000,defaultValue:'轮到我忽略类型'},
名字:{value:'test',defaultValue:'unknown'}
};
您需要将值的类型(而不是键的类型)传递到定义
类型定义映射={
[key in keyof T]:定义
}
//嗯
常量映射:定义映射=
{
年龄:{value:5,defaultValue:0},
名字:{value:'test',defaultValue:'unknown'}
};
//错误如预期
常量映射2:定义映射=
{
年龄:{value:'我不是数字',默认值:0},
名字:{value:'test',defaultValue:'unknown'}
};
//错误如预期
常量映射3:定义映射=
{
年龄:{value:1000,defaultValue:'轮到我忽略类型'},
名字:{value:'test',defaultValue:'unknown'}
};
type persondefinationmap={[key-in-keyof-Person]:Definition}
似乎对我有用type persondefinationmap={[key-in-keyof-Person]:Definition}
似乎对meSo有用一个简单的解决方案,非常感谢!非常简单的解决方案,非常感谢!
type DefintionMap<T> = {
[key in keyof T]: Definition<T[key]>
}
// OK
const map: DefintionMap<Person> =
{
age: { value: 5, defaultValue: 0 },
firstName: { value: 'test', defaultValue: 'unknown' }
};
// Error as expected
const map2: DefintionMap<Person> =
{
age: { value: 'I AM NOT A NUMBER', defaultValue: 0 },
firstName: { value: 'test', defaultValue: 'unknown' }
};
// Error as expected
const map3: DefintionMap<Person> =
{
age: { value: 1000, defaultValue: 'MY TURN TO IGNORE THE TYPE' },
firstName: { value: 'test', defaultValue: 'unknown' }
};