関数パラメータに応じて異なるオブジェクトを返す関数があります。Typescriptでこれを達成する方法はありますか?
これは私がどこまで得たかです:
type returnMap = {
'a': number,
'b': string[]
}
function func<T extends returnMap, K extends keyof T>(val: K): T[K] {
if (val == 'a') {return 5}
if (val == 'b') {return ['a', 'b']}
return 42
}
console.log(func('a')) // 5
ただし、戻り値には「TS2322:タイプ「5」はタイプ「T [K]」に割り当てられません」と記載されています。
前もって感謝します
これは行います:
interface ReturnMap {
'a': number;
'b': string[];
}
function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] {
if (val === 'a') return 5;
if (val === 'b') return ['a', 'b'];
throw new Error();
}
const r1 = func('a'); // const r1: number
const r2 = func('b'); // const r2: string[]
// Argument of type '"c"' is not assignable to parameter of type '"a" | "b"'.ts(2345)
const r3 = func('c'); // const r3: number | string[]
関数のオーバーロード構文に注意してください。
function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] { // ...
2番目の署名のみを使用した場合、返されるタイプは常にnumber | string[]
です。
最初の署名のみを使用した場合、それReturnMap[K]
はnumber & string[]
排他的であると評価されるため、上記の質問で説明したエラーが発生します。
ちなみに、バグのある振る舞いのようにReturnMap[K]
評価されましたnumber & string[]
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加