如何在打字稿中区分模块名称和 *main exported type*?

How do i differentiate module name from *main exported type* in typescript?

提问人:InglouriousBastard 提问时间:9/27/2023 最后编辑:InglouriousBastard 更新时间:9/28/2023 访问量:35

问:

我想在 TS 中使用这样的代码:

task.ts

export type Task = {
  name: string
  description: string
  cost: number
  done: boolean
}


export function increaseCost(task: Task, percent: number) {
  return { ...task, cost: task.cost * (1 + percent / 100) }
}

index.ts

import {Task,  increaseCost} from "./task.ts"
 
let task: Task = {...}

Task.increaseCost(task, 15)
Task.anotherFunction(task)
Task.yetAnotherFunction(task)

基本上我想将 Task 作为命名空间。但是类型 Task 正在干扰。

一个选项是:

task.ts

export type Task 

然后

index.ts

import * as Task from "task.ts"
let task: Task.Task // this seems redundant

另一种选择:

task.ts

export type Type 

index.ts

import * as Task from "task.ts" 
let task: Task.Type // seems odd/weird  

你会如何处理这个问题?如何区分模块/命名空间任务和任务类型?

JavaScript TypeScript 模块 命名空间 node-modules

评论

1赞 Kile Kasmir Asmussen 9/27/2023
请使用更具描述性的标题
0赞 VLAZ 9/27/2023
不是很清楚你想要什么:是一个类型,你有一些对象叫吗?因为否则代码就没有意义了。TaskTaskTask.increaseCost(task, 15)
0赞 InglouriousBastard 9/27/2023
@VLAZ我想将 Task 用作命名空间(一组与 Task 类型相关的函数)。我想用“Task”作为这些函数的前缀。但当然,Task 已经是导出类型了。

答:

1赞 xVanTuring 9/27/2023 #1

您可以使用 or 关键字,但不再推荐使用:modulenamespacemodule

import { Task } from './task';
let a: Task = { cost: 10, description: '', done: false, name: '' };
console.log(Task.increaseCost(a, 10));
// task.ts
export type Task = {
  name: string;
  description: string;
  cost: number;
  done: boolean;
};

export namespace Task {
  export function increaseCost(task: Task, percent: number) {
    return { ...task, cost: task.cost * (1 + percent / 100) };
  }
}

在线演示在这里 stackblitz 类型。(打开控制台查看结果。

评论

0赞 InglouriousBastard 9/27/2023
这正是我想要的。模块可以以某种方式替换为命名空间吗?前提是不推荐使用该模块
0赞 xVanTuring 9/27/2023
是的你可以。我会将其添加到代码中。很高兴看到它有所帮助。