TypeScriptのジェネリクスでエラーになる
Q&A
Closed
TypeScriptのジェネリクスを使うとエラーになる
以下コードの2箇所でエラーが発生してしまいます。
このコードは参加者にそれぞれエントリーナンバー(id)と点数が振られており、その点数で対戦をして
firstBattleとsecondBattleで勝ったもの同士が決勝に進みthirdWinnerになるというようなコードです。
トーナメント戦を意識しています。
const entryNumbers = [3, 6, 7, 9]
const timeTakens = [3000, 500, 600, 700]
const getResult = <T extends number> (choiceNum: T, entryNumbers: T[], timeTaken: T[]): T[] => {
const selectedInedexNum: T = entryNumbers.indexOf(choiceNum) //エラー発生
return [entryNumbers[selectedInedexNum], timeTaken[selectedInedexNum]]
}
const battle = <T extends number>(player1Num: T, player2Num: T, entryTable: T[], resultTable: T[]): T[] => {
const player1 = getResult<number>(player1Num, entryNumbers, timeTakens)
const player2 = getResult<number>(player2Num, entryNumbers, timeTakens)
return(player1[1] > player2[1] ? player1 : player2) //エラー発生
}
const firstBattle = [3, 6]
const secondBattle = [7, 9]
const firstWinner:number[] = battle<number>(firstBattle[0], firstBattle[1], entryNumbers, timeTakens)
const secondWinner:number[] = battle<number>(secondBattle[0], secondBattle[1], entryNumbers, timeTakens)
const thirdWinner:number[] = battle<number>(firstWinner[0], secondWinner[0], entryNumbers, timeTakens)
console.log(firstWinner)
console.log(secondWinner)
console.log(thirdWinner)
エラー部分にホバーして出てきたエラーは以下です。
selectedInedexNumにホバーした結果
Type 'number' is not assignable to type 'T'.
'number' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'number'.(2322)
const selectedInedexNum: T extends number
return(player1[1] > player2[1] ? player1 : player2)にホバーした結果
Type 'number[]' is not assignable to type 'T[]'.
Type 'number' is not assignable to type 'T'.
'number' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'number'.(2322)
TypeScriptは勉強し始めたばかりで全然慣れていません…
ジェネリクスを使わずに、Tのところを全てnumberとすればエラーにならないのですが…
すみませんが、ご教授頂けると幸いです。