命名について
変数名については、後述する実装方法のバリエーションによって慣習的に使われるものが変わるので割愛しますが、関数名についてのみ、あくまで個人的な意見ですが、
function getErrorReason(reasonCode: ErrorReasonCode): ErrorReason {
// do something
}
で十分かと思います。
reasonを取得するために何を与える必要があるかは引数名および型をみれば明らかだと思いますので、混乱することはないと感じるからです。
捕捉として、例えばあるオブジェクトを取得するためのキーが複数種類存在する場合、例えばDateオブジェクトは
new Date()
new Date("2022-07-09T15:53:31.031Z")
new Date(1657382011031)
など様々なkeyで生成することができますが、これらを関数として命名する際には、それぞれ別の名前として
function getDateNow() {
return new Date()
}
function getDateFromISOString(isoString: string) {
return new Date(isoString)
}
function getDateFromTimestamp(timestamp: number) {
return new Date(timestamp)
}
としてあげるのが分かりやすいでしょう。
今回の投稿者さんのケースではErrorReasonCode以外のものからErrorReasonを取得するケースはほぼなさそうなので、単にgetErrorReasonで良いかなと感じます
オブジェクトか関数か
今回のケースでいうと、命名よりReasonCodeとしてstringを受け取っていることのほうがTypescriptの型安全性を活用できていないのでもったいないかもしれません。
ErrorReasonCodeやErrorReasonは取りうる値が事前に分かっていると思いますので、少なくともErrorReasonCodeはTypescriptではEnum
かconstキーワードを伴ったオブジェクト
で定義するのが良いでしょう
ErrorReasonCodeだけEnumを使って、ErrorReasonは関数だけで表現することは可能ですが、あまり一般的ではないかもしれません
Enum or constオブジェクトを使うメリット及び両者の比較は、 こちらのサイト などが参考になると思います
実装方法はいくつかのバリエーションが考えられるため、いくつかの例を示します
いずれの例も、ErrorReasonを取得する再に存在しないErrorReasonCodeは入力できない(コンパイル時にエラーとなる)ようになっているはずです。
もし気に入っていただけるようでしたら、実際にいくつか書いてみてしっくりくるものを探してみてもよいかもしれません。
Enum + 関数
enum ErrorReasonCode = {
REQUIRED: "01",
// ...
}
enum ErrorReason = {
REQUIRED: "必須入力項目です",
// ...
}
function getErrorReason(reasonCode: ErrorReasonCode): ErrorReason {
if (reasonCode === ErrorReasonCode.REQUIRED) {
return ErrorReason.REQUIRED
}
// else if(...) { ... }
}
const api = () => {
const reasonCode = ErrorReasonCode.REQUIRED
return {
status:200,
data:{
reasonCode,
reason: getReason(reasonCode),
}
}
}
constオブジェクト (ErrorReasonCode + ReasonCode) + 関数
export const ErrorReasonCode = {
REQUIRED: "01",
// ...
} as const
export type ErrorReasonCode = typeof ErrorReasonCode[keyof typeof ErrorReasonCode]
export enum ErrorReason = {
ErrorReasonCode.REQUIRED: "必須入力項目です",
// ...
} as const
export type ErrorReason = typeof ErrorReason[keyof typeof ErrorReason]
export function getErrorReason(reasonCode: ErrorReasonCode): ErrorReason {
return ErrorReason[reasonCode]
}
const api = () => {
const reasonCode = ErrorReasonCode.REQUIRED
return {
status:200,
data:{
reasonCode,
reason: getReason(reasonCode),
}
}
}
constオブジェクト (ErrorReason) + 関数
export enum ErrorReason = {
"01": "必須入力項目です",
// ...
} as const
export type ErrorReasonCode = keyof typeof ErrorReason
export type ErrorReason = typeof ErrorReason[keyof typeof ErrorReason]
export function getErrorReason(reasonCode: ErrorReasonCode): ErrorReason {
return ErrorReason[reasonCode]
}
const api = () => {
const reasonCode = "01"
return {
status:200,
data:{
reasonCode,
reason: getReason(reasonCode),
}
}
}
constオブジェクト (ErrorReason + ReasonCode) ( +関数なし)
export const ErrorReasonCode = {
REQUIRED: "01",
// ...
} as const
export type ErrorReasonCode = typeof ErrorReasonCode[keyof typeof ErrorReasonCode]
export enum ErrorReason = {
ErrorReasonCode.REQUIRED: "必須入力項目です",
// ...
} as const
export type ErrorReason = typeof ErrorReason[keyof typeof ErrorReason]
const api = () => {
const reasonCode = ErrorReasonCode.REQUIRED
return {
status:200,
data:{
reasonCode,
reason: ErrorReason[reasonCode],
}
}
}