function f<T>(defaultValue?: T) { return defaultValue; }
const definitelyUndefined = f<string>(); // type: string | undefined
const definitelyString = f<string>('foobar'); // type: string | undefined
是否可以定义f()
,使得definitelyUndefined
隐式为undefined
,definitelyString
隐式为string
?
背景
我的真实的用例是一个我正在使用并希望改进的函数。它是function f<T>(o: { [key: string]: T }, key: string, defaultValue?: T)
,如果它存在,它将返回key[o]
,否则返回defaultValue
。当我向它提供defaultValue
时,我保证会返回T
,但Typescript认为它是T | undefined
。
2条答案
按热度按时间j1dl9f461#
对于您的第一个案例,我立即想到了使用重载,例如:
但是,对于更复杂的用例,我认为也许可以用重载和更复杂的泛型来解决,例如:
我不知道这是否适用于所有可能的场景(因为返回类型是基于泛型类型参数确定的,而不是实际的函数参数),但我认为它非常接近。
46scxncf2#
可接受的答案将“类型空间”和“值空间”合并(正如其中一条注解所述)。
这是次优的。这里有一个替代方案:
** typescript 〉= 4.7.4**
** typescript 〈4.7.4**