gpt4 book ai didi

typescript - 根据可选参数指定返回类型

转载 作者:行者123 更新时间:2023-12-04 16:02:36 25 4
gpt4 key购买 nike

function f<T>(defaultValue?: T) { return defaultValue; }

const definitelyUndefined = f<string>(); // type: string | undefined
const definitelyString = f<string>('foobar'); // type: string | undefined

是否可以定义 f()使得 definitelyUndefined隐含地是 undefineddefinitelyString隐含地是 string ?

背景

我的真实世界用例是我正在使用并希望改进的功能。是 function f<T>(o: { [key: string]: T }, key: string, defaultValue?: T)它返回 key[o]如果存在,否则 defaultValue .当我提供它时 defaultValue ,我保证得到 T回来,但 Typescript 认为它 T | undefined .

最佳答案

对于您的第一种情况,我立即想到使用重载,例如:

function f<T>(): undefined;
function f<T>(value: T): T;
function f<T>(value?: T) { return value; }

const definitelyUndefined = f(); // type: undefined
const definitelyString = f('foobar'); // type: "foobar"

但是,对于更复杂的用例,我认为您可以使用重载和更复杂的泛型来解决它,例如:
function f<T, K extends string & keyof T>(o: T, key: K, defaultValue?: T[K]): T[K];
function f<T, V = undefined>(o: T, key: string, defaultValue?: V): V;
function f<T, V = undefined>(o: T, key: string, defaultValue?: V) {
return o[key] || defaultValue;
}

const obj = { foo: "123" };

const definitelyUndefined = f(obj, "bar"); // type: undefined
const definitelyNumber = f(obj, "bar", 123); // type: number
const definitelyString = f(obj, "foo"); // type: string

我不知道这是否适用于所有可能的场景(因为返回类型是基于泛型类型参数确定的,而不是实际的函数参数),但我认为它非常接近。

关于typescript - 根据可选参数指定返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55328397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com