gpt4 book ai didi

generics - 如何输入返回子类型的泛型函数

转载 作者:行者123 更新时间:2023-12-02 21:58:20 24 4
gpt4 key购买 nike

根据flow's documentation ,流中的泛型会跟踪周围的值。

这意味着这会引发错误:

function identity<T>(value: T): T {
if (typeof value === 'string') {
// $ExpectError
return '';
}

return value;
}

据我所知,他们的文档没有提到如何最好地输入这样的函数。理想情况下,您希望指定该函数返回输入类型的子类型。

具体来说,我想避免那些不太安全的类型:

function identity<T>(value: T): (T | string) {
...
}

function identity(value: mixed): mixed {
...
}

我一直对这个谜团感到困惑。我非常感谢对此的任何帮助。

谢谢!

最佳答案

这个问题问得好!我能想到的最好的办法是,您的代码似乎是正确的,并且流程可能应该支持这种情况。同时,您可以先转换为 any,然后再转换回 T,以便函数具有正确的签名:

// Has the inferred signature `<T>(value: T) => T`
function identity<T>(value: T) {
if (typeof value === 'string') {
return ((value: any): T)
}

return value;
}

( Try )

奇怪的是,我还发现在值上使用 substr 并将返回类型注释为 T 可能会导致 T => T > 被无错误地接受,尽管它本质上与返回 '' 相同(?!?!)

function identity<T>(value: T): T {
if (typeof value === 'string') {
return value.substr(0,0)
}

return value;
}

( Try )

也许文字字符串和动态字符串在幕后被不同地对待,导致类型处理上出现这种奇怪的差异?

从实用的角度来看,如果您最终进行强制转换,那么为该函数应该处理的不同情况添加单元测试是明智的。

关于generics - 如何输入返回子类型的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873504/

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