![](/img/trans.png)
[英]How to define Typescript function that takes a type as a strongly typed argument
[英]How to define strongly typed map, based on another type
我卡住了,可能需要一些帮助,或者只是从外面重新审视一下。
我有这个代码。 主要思想是有一个描述属性和连接值类型的类型(参见类型 Person)。 然后将其转换为有点 map 的元数据(参见 const 映射)。
type Person = {
firstName: string;
age: number;
}
type Definition<T> = {
value: T,
defaultValue: T
}
type PersonDefintionMap<T> = {
[key in keyof Person]: Definition<T>
}
const map: PersonDefintionMap<Person[keyof Person]> =
{
age: { value: 5, defaultValue: 0 },
firstName: { value: 'test', defaultValue: 'unknown' }
};
它工作得很好,它迫使我填写所有属性,并且不允许我放入 Person 类型中未描述的内容。 但它仍然有两个弱点:
const map: PersonDefintionMap<Person[keyof Person]> =
{
age: { value: 'I AM NOT A NUMBER', defaultValue: 0 },
firstName: { value: 'test', defaultValue: 'unknown' }
};
const map: PersonDefintionMap<Person[keyof Person]> =
{
age: { value: 1000, defaultValue: 'MY TURN TO IGNORE THE TYPE' },
firstName: { value: 'test', defaultValue: 'unknown' }
};
我明白为什么会这样(我们使用联合进行类型定义,但我没有找到解决它的方法。关于如何解决这个问题的任何想法?有可能吗?
您需要将值的类型(而不是键的类型)传递给Definition
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' }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.