我使用简单模式在对象中定义DB模式:

{
   name: 'string',
   age: 'integer',
   ...
}

是否有可能从这个对象创建一个接口或类,这样我就不必键入所有内容两次?

推荐答案

你可以这样做,但这可能会比它的价值更麻烦,除非你认为你可能会改变模式.TypeScript没有以您想要的方式推断类型的内置方法,因此您必须哄骗它这样做:


首先,定义一种将文字名称'string''integer'映射到它们所代表的类型脚本类型的方法(可能分别是stringnumber):

type MapSchemaTypes = {
  string: string;
  integer: number;
  // others?
}

type MapSchema<T extends Record<string, keyof MapSchemaTypes>> = {
  -readonly [K in keyof T]: MapSchemaTypes[T[K]]
}

现在,如果您可以获取一个适当类型的模式对象,比如您指定的对象,并从中获取关联的类型:

const personSchema = {name: 'string', age: 'integer'}; 
type Person = MapSchema<typeof personSchema>; // ERROR

哎呀,问题是personSchema被推断为{name: string; age: string},而不是期望的{name: 'string'; age: 'integer'}.您可以通过类型注释来修复此问题:

const personSchema: { name: 'string', age: 'integer' } = { name: 'string', age: 'integer' }; 
type Person = MapSchema<typeof personSchema>; // {name: string; age: number};

但现在感觉你在重复自己.幸运的是,有一种方法可以迫使它推断出正确的类型:

function asSchema<T extends Record<string, keyof MapSchemaTypes>>(t: T): T {
  return t;
}
const personSchema = asSchema({ name: 'string', age: 'integer' }); // right type now
type Person = MapSchema<typeof personSchema>; // {name: string; age: number};

更新2020-06:在更新的TS版本中,您可以使用const assertion来获得相同的结果:

const personSchema = { name: 'string', age: 'integer' } as const;
type Person = MapSchema<typeof personSchema>;

真管用!


请看《行动on the Typescript Playground》.希望有帮助;祝你好运

Typescript相关问答推荐

类型缩小对(几乎)受歧视的unions 不起作用

Tailwind CSS样式不在Svelte应用程序中呈现

在TypScript手册中可以视为接口类型是什么意思?

在将对象从一个对象转换成另一个对象时,可以缩小对象的键吗?

如何判断输入是否是TypeScript中的品牌类型?

在TypeScript中,除了映射类型之外还使用的`in`二进制运算符?

将值添加到具有不同类型的对象的元素

当我点击外部按钮时,如何打开Html Select 选项菜单?

编剧错误:正在等待Expect(Locator).toBeVisible()

TypeScrip省略了类型参数,仅当传递另一个前面的类型参数时才采用默认类型

如何在Reaction Query Builder中添加其他字段?

如何在Vue中使用Enum作为传递属性的键类型?

声明文件中的类型继承

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

在Mac和Windows上运行的Web应用程序出现这种对齐差异的原因是什么?(ReactNative)

类型';字符串|数字';不可分配给类型';未定义';.类型';字符串';不可分配给类型';未定义';

缩小对象具有某一类型的任意字段的范围

Select 类型的子项

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?

如何在由函数参数推断的记录类型中具有多个对象字段类型