gpt4 book ai didi

typescript - 不要扩大对象字面量中潜在的字面量类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:58:49 25 4
gpt4 key购买 nike

我经常使用由字符串和数字组成的不可变对象(immutable对象)。例如:

const InternalServerError = {
status: 500,
message: 'Internal Server Error'
}

我从不更改属性,所以我更喜欢 InternalServerError 的类型使用数字和字符串文字,如下所示:

{
status: 500,
message: 'Internal Server Error'
}

但是,TypeScript 会自动扩展 InternalServerError 的推断类型中的类型:

{
status: number,
message: string
}

我可以将每个属性转换为其文字类型,如下所示:

const InternalServerError = {
status: 500 as 500,
message: 'Internal Server Error' as 'Internal Server Error'
}

但这有两个问题:

  1. 重复,尤其是长字符串
  2. 有可能将值转换为错误的文字类型(例如,500 为 501)并且编译器不会报错,因此容易出现拼写错误。

实现此目标的最简单(最少的样板代码或重复)和最安全的类型(未捕获类型错误的可能性最小)的方法是什么?

最佳答案

您可以使用泛型创建辅助函数来推断精确类型(例如,500 而不是 number):

function makeError<
S extends number,
M extends string
>(status: S, message: M): {status: S, message: M} {
return {status, message}
}

const InternalServerError = makeError(500, 'Internal Server Error')
const NotFoundError = makeError(404, 'Not found')

// Code = 500
type Code = (typeof InternalServerError)['status']
// Message = Internal Server Error
type Message = (typeof InternalServerError)['message']

关于typescript - 不要扩大对象字面量中潜在的字面量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49433142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com