我有一个函数,该函数将根据function参数返回不同的对象。有没有办法可以在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] { // ...
如果仅使用第二个签名,则返回的类型将始终为number | string[]
。
如果您仅使用第一个签名,则将ReturnMap[K]
其评估为number & string[]
排他性的,因此您会收到上述问题中描述的错误。
顺便说一下,被ReturnMap[K]
评估为number & string[]
似乎是越野车行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句