TypeScript:非零数字

TypeScript:非零数字,typescript,Typescript,我试图找出是否有一种方法可以在TypeScript中设置一个反映非零数字的类型: type Task = { id: number }; const task: Task = { id: 5 }; const tasks: { [taskId: number]: Task } = { 5: task }; function getTask(taskId: number | undefined): Task | undefined { return taskId && t

我试图找出是否有一种方法可以在TypeScript中设置一个反映非零数字的类型:

type Task = { id: number };
const task: Task = { id: 5 };
const tasks: { [taskId: number]: Task } = { 5: task };

function getTask(taskId: number | undefined): Task | undefined {
    return taskId && tasks[taskId];
}


在上面的代码中,TypeScript抱怨说,因为
taskId
是一个数字,它可能是
0
,这是错误的,因此函数将返回
0
,而不是
任务
未定义的
。实际上,任务id不可能是
0
。它将始终是一个正整数,因此这种情况不是问题。有没有一种方法可以声明
任务
类型,以向TypeScript表明此数字永远不会是错误的?我宁愿避免使用额外的条件逻辑来说服TypeScript。

TypeScript无法保证任何可能的
taskId
都会有任务

这里有几个选项:

  • 使用非空断言运算符通知typescript您知道得更好,并确保任务始终存在
  • 通过将类型定义为枚举或类似项,将其约束为可能的
    taskId
    集合
  • 检查任务是否存在,如果未定义,则引发异常
假设您的任务集是动态的,我个人会选择最后一个选项,例如:

function getTask(taskId: number): Task {
     const task = tasks[taskId]
     
     if(!task){ throw new Error(`task with id ${taskId} does not exist`) }

    return task
}

因为如果您的不变量被违反,这将给您带来一个有用的错误。

为什么不使用一个简单的数组而不是哈希映射,哈希映射的键是数字?不,不可能。但您可以使用重载来解决这个问题,这是另一个选项:
returntaskid&&tasks[taskId]| | undefined
这里的问题不是是否存在任务,而是
taskId
是否将
0
taskId
可能是
未定义的
或者可能没有任务,这很好,但我试图说服TypeScript它不会是
0
,这是错误的。