TypeScript共享仓库导入未使用成员函数和接口会产生多少性能损耗?
性能损耗问题结论
你担心的性能损耗几乎可以忽略,分两个层面说明:
- 类型层面:TS的
interface、类型定义只会在编译阶段生效,编译成JS后会被完全删除,所以即使共享仓库里包含了服务端用不到的类型定义,也不会产生任何运行时开销。 - 运行时代码层面:类的成员方法是挂载在原型对象上的,所有实例共享同一份方法引用,就算你创建数百万个实例,无用的
decrypt方法也只会占用一份内存,开销可以忽略。如果你的项目用ES Module规范打包,开启Tree Shaking后,未被调用的方法还会被自动剔除,完全不会出现在服务端的最终产物里。
保留简洁调用写法的方案
你完全不需要舍弃encryptedRecord.decrypt()的链式调用写法,用TS的模块扩展+原型挂载的方案就能实现共享仓库不包含解密逻辑、客户端可以正常调用成员方法的需求:
- 共享仓库只保留基础的类定义、加密相关逻辑和公共类型,不要写
decrypt相关的实现和类型声明:
// 共享仓库 record.ts export class Record { // 明文数据字段 content: unknown; encrypt(cryptoKey: CryptoKey): EncryptedRecord { // 加密逻辑 return new EncryptedRecord(encryptedData); } } export class EncryptedRecord { encryptedData: string; constructor(data: string) { this.encryptedData = data; } }
- 客户端单独新增一个扩展文件,仅在客户端编译范围内引入,给共享类扩展
decrypt方法:
// 客户端 extends-shared.ts import { Record, EncryptedRecord } from 'shared-repo'; // 给TS类型声明扩展decrypt方法 declare module 'shared-repo' { interface EncryptedRecord { decrypt(cryptoKey: CryptoKey): Record; } } // 给原型挂载实际的decrypt实现 EncryptedRecord.prototype.decrypt = function (cryptoKey: CryptoKey): Record { // 解密逻辑写在这里 const decryptedContent = decryptLogic(this.encryptedData, cryptoKey); const record = new Record(); record.content = decryptedContent; return record; };
- 把这个扩展文件加入客户端
tsconfig.json的include数组里,服务端的tsconfig不要包含这个文件即可。
这样实现后:
- 服务端完全看不到
decrypt方法的类型,也不会引入任何解密相关的运行时代码 - 客户端可以正常用
encryptedRecord.decrypt(cryptoKey)的写法,TS类型校验完全正常,不需要单独导入一堆解密函数
内容的提问来源于stack exchange,提问作者Curl
相关产品推荐
相关产品推荐

