Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 如何基于另一种类型定义强类型映射_Typescript - Fatal编程技术网

Typescript 如何基于另一种类型定义强类型映射

Typescript 如何基于另一种类型定义强类型映射,typescript,Typescript,我卡住了,可能需要一些帮助,或者只是从外面看一看 我有这个密码。其主要思想是创建一个类型,该类型描述属性,并连接值类型(请参见类型Person)。然后将其转换为具有元数据的类映射(请参见常量映射) type Person={ 名字:字符串; 年龄:人数; } 类型定义={ 值:T, 默认值:T } 类型PersonDefinitionMap={ [输入个人密码]:定义 } 常量映射:PersonDefinitionMap= { 年龄:{value:5,defaultValue:0}, 名字:{v

我卡住了,可能需要一些帮助,或者只是从外面看一看

我有这个密码。其主要思想是创建一个类型,该类型描述属性,并连接值类型(请参见类型Person)。然后将其转换为具有元数据的类映射(请参见常量映射)

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' }
};