◯ 詳細なし

単純に Error のインスタンスを作って throw

throw new Error("aa")

◯ assign

エラー処理などに使う補足のデータを含めたいとき
プロパティとして Error オブジェクトに追加する 

throw Object.assign(new Error("aa"), { detail: "xxxx" })

◯ object

Error オブジェクトと補足情報を別々にもつオブジェクトを throw する
throw 対象は Error オブジェクトじゃなくてもいい

throw { error: new Error("aa"), detail: "xxxx" }

◯ custom error type

ちゃんとした作りにするなら Error を継承したそれ用の型を作るのがたぶん適切
異なる型なので特別なプロパティを持ってそうということが伝わるし instanceof で種別判定もできる

class AaError extends Error {
constructor(message, detail) {
super(message)
this.detail = detail
}
}

throw new AaError("aa", "xxxx")

◯ no error object

Error オブジェクトは特に必須じゃない
スタックトレースが要らないなら省いてもいい

throw { error: "aa", detail: "aa-error" }