You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现可调用函数处理字符串的TypeScript类型?以pluralize复数化需求为例

如何实现可调用函数处理字符串的TypeScript类型?以pluralize复数化需求为例

兄弟,我太懂你这种新手写TypeScript类型的痛苦了——自己凑的复数规则漏洞百出,想直接用现成的pluralize库却不知道怎么在类型里实现,对吧?别慌,我给你唠几个靠谱的解决方案:

1. 最稳妥:预定义表名映射(适合固定表名场景)

既然你的需求是处理数据库表名,而表名肯定是有限且固定的,那直接给每个表名单数对应上正确的复数形式就完事儿了,既准确又省心:

// 先定义一个运行时的映射对象,同时作为类型的数据源
const tablePluralMap = {
  Student: 'Students',
  day: 'days',
  thesis: 'theses',
  category: 'categories',
  // 把你所有的数据库表名都加进来
} as const;

// 基于这个对象生成复数类型
type Pluralize<T extends keyof typeof tablePluralMap> = typeof tablePluralMap[T];

// 用起来试试
type StudentsTable = Pluralize<'Student'>; // 类型是'Students'
type DaysTable = Pluralize<'day'>; // 类型是'days',完美解决之前的错误

这种方式完全不会有规则遗漏的问题,毕竟你的表名数量肯定不多,维护起来也简单。

2. 省事儿:用现成的社区类型库

如果你需要处理任意字符串的复数类型,不想自己维护规则,可以找找社区已经做好的类型库。有些库把pluralize的所有复数规则都转换成了TypeScript类型,直接导入就能用,比如type-fest里就有类似的复数类型工具,或者专门的复数类型包,直接搜一下就能找到。

这种方式不用自己写任何规则,直接站在巨人的肩膀上就行。

3. 进阶:用脚本自动生成类型定义

如果你一定要结合pluralize库的逻辑来生成类型,可以写个简单的Node.js脚本,提前把所有需要处理的字符串(比如你的表名单)用pluralize处理,生成对应的类型文件:

// pluralize-generator.js
const pluralize = require('pluralize');
const fs = require('fs');

// 你的数据库表名单数组
const tableNames = ['Student', 'day', 'thesis', 'category', 'city'];

// 生成类型映射的内容
const typeEntries = tableNames.map(name => `  '${name}': '${pluralize(name)}'`).join(',\n');
const typeContent = `export type Pluralize<T extends keyof typeof PluralMap> = typeof PluralMap[T];

const PluralMap = {
${typeEntries}
} as const;`;

// 写入到类型文件里
fs.writeFileSync('./src/pluralize-types.ts', typeContent);

然后在项目里运行这个脚本(比如加到package.json的scripts里),就能自动生成准确的复数类型文件,之后在代码里直接导入使用就行。

为啥你之前的写法不行?

最后得给你唠明白:TypeScript的类型系统是静态编译时工作的,它只能处理类型层面的逻辑,没法执行运行时的JavaScript函数。pluralize是一个运行时才会执行的函数,所以你直接在类型里调用它,TypeScript根本不知道怎么在编译时算出结果,这就是那个写法报错的原因。

备注:内容来源于stack exchange,提问作者Zenith2198

火山引擎 最新活动