我有如下TS对象:

const myObject = {
   AdminInviteStudent:  ['inviterGivenName', 'inviterFamilyName', 'link'],
   DeleteMappingStudent: ['teacherGivenNameAndInitialOfFamilyName', 'studentGivenName', 'noteLink']
};

基于该对象导出类型的TS函数是什么?

我想将该对象作为参数传递,如下所示:

export type EmailTemplateParameters = getType(myObject);

所有数组值都应设置为必需的字符串.

在这种情况下,EmailTemplateParameters结果应为:

{
  AdminInviteStudent: {
    inviterGivenName: string;
    inviterFamilyName: string;
    link: string;
  };
  DeleteMappingStudent: {
    teacherGivenNameAndInitialOfFamilyName: string;
    studentGivenName: string;
    noteLink: string;
  };
}

或者也许有更好的方法来加强对我最初问题的回答:How to export TypeScript types as object to expose which keys are available

推荐答案

第一步是用as const注释myObject,这样字符串值将被"保留"为文字类型.

const myObject = {
   AdminInviteStudent:  ['inviterGivenName', 'inviterFamilyName', 'link'],
   DeleteMappingStudent: ['teacherGivenNameAndInitialOfFamilyName', 'studentGivenName', 'noteLink']
} as const;

然后,如果我们有一个类型要映射到一个对象上,而数组要创建一个新类型:

type GetType<T extends Record<string, readonly string[]>> = { // allow readonly arrays
  -readonly [K in keyof T]: { // remove readonly modifier
    [P in T[K][number]]: string;
  }
};

我们可以将类型(typeof)myObject传递给它,并得到正确的结果:

export type EmailTemplateParameters = GetType<typeof myObject>;

Playground


解决前面的问题,你应该从对象中派生类型,而不是从类型中派生对象(这是不可能的):

type CreateType<Keys extends readonly string[]> = { [K in Keys[number]]: string };

type AdminInviteStudent = CreateType<typeof myObject["AdminInviteStudent"]>;

Typescript相关问答推荐

TypScript在对象上强制执行值类型时推断对象文字类型?

对于使用另一个对象键和值类型的对象使用TS Generics

如何在第一次加载组件时加载ref数组

动态调用类型化函数

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

异步动态生成Playwright测试,显示未找到测试

TypeScrip表示该类型不可赋值

打字类型保护递归判断

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

如何从扩展接口推断泛型?

迭代通过具有泛型值的映射类型记录

使用2个派生类作为WeakMap的键

在打印脚本中使用泛型扩展抽象类

如何将父属性类型判断传播到子属性

正交摄影机正在将渲染的场景切成两半

Angular material 无法显示通过API获取的数据

复选框Angular 在Ngfor中的其他块中重复

如何在打字角react 式中补齐表格组

TypeScript:如何使用泛型和子类型创建泛型默认函数?

React中的效果挂钩在依赖项更新后不会重新执行