如何在Typescript中正确定义扩展函数?



我有一个这样的class:

export default class UserDto {
email: string;
permissions: string[];
roles: string[];
}

和定义toUserd.ts文件:

declare global {
class UserDto {
toUser(): User;
}
}

和常规ts文件中的函数声明:

import User from "types/User";
import Activity from "types/Activity";
import Role from "types/Role";
import UserDto from "types/UserDto";
UserDto.prototype.toUser() = function (): User {
return {
email: this.email,
permissions: new Set(this.permissions.map((p) => Activity[p])),
roles: new Set(this.roles.map((r) => Role[r])),
};
};

我的问题是,当我尝试使用这个扩展不工作(和VS Code不承认它):

import Role from "types/Role";
import User from "types/User";
import UserDto from "types/UserDto";
import Activity from "types/Activity";
import toUser from "extensions/UserDtoExtensions";
import users from "data/users.json";
import roles from "data/roles.json";
export default function findUser(email: string): User {
const userDto: UserDto = users[email];
if (userDto) {
return userDto.toUser();
} else {
return {
email: "anon@anon.com",
permissions: new Set(
roles.Anonymous.permissions.map((p) => Activity[p])
),
roles: new Set([Role.Anonymous]),
};
}
}

TypeError: userDto。tuser不是一个函数

我做错了什么?

同样有趣的是,在我增加prototypeVS Code的文件中也写着

赋值表达式的左边必须是变量或属性访问。

为什么?

  1. 在文档中:

默认导出也不能增强

  1. declare module "types/UserDto",而不是declare global

  2. import "extensions/UserDtoExtensions",不含toUser from

认为这些应该是所有需要的更改。

最新更新