gpt4 book ai didi

Typescript - 正确输入带有可选参数的函数

转载 作者:行者123 更新时间:2023-12-05 02:27:46 25 4
gpt4 key购买 nike

假设我们有以下函数:

function test<S, T>(obj: S, prop: keyof S, mapper?: (value: S[keyof S]) => T): S[keyof S] | T {
return typeof mapper === 'function'
? mapper(obj[prop])
: obj[prop];
}

如果我在没有 mapper 参数的情况下使用它,则返回值的类型无法正确推断:

const value = test({ a: 'stringValue' }, 'a'); // value is of type "unknown"

但是如果我提供一个身份函数作为第三个参数,它会被正确推导:

const value = test({ a: 'stringValue' }, 'a', x => x); // value is of type "string"

test 函数应该如何类型化,以便在我们不提供 mapper 参数时,正确推断返回值的类型?

Playground link

最佳答案

只需使用 function overloads !

function test<S, T>(obj: S, prop: keyof S): S[keyof S];
function test<S, T>(obj: S, prop: keyof S, mapper: (value: S[keyof S]) => T): T;
function test<S, T>(obj: S, prop: keyof S, mapper?: (value: S[keyof S]) => T): S[keyof S] | T {
return typeof mapper === 'function'
? mapper(obj[prop])
: obj[prop];
}

const value = test({ a: 'stringValue' }, 'a'); // string

const value2 = test({ a: 'stringValue' }, 'a', x => x); // string

Playground

关于Typescript - 正确输入带有可选参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72927797/

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