繁体   English   中英

如何定义强类型 map,基于另一种类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM