TypeScript:非零数字
我试图找出是否有一种方法可以在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
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
,这是错误的。