gpt4 book ai didi

typescript 返回分配函数的推断类型,但限制返回类型以扩展预定义类型

转载 作者:行者123 更新时间:2023-12-04 07:18:26 25 4
gpt4 key购买 nike

我正在编写许多函数(用于服务器请求),每个函数返回类型都扩展了某种类型。
我希望 typescript 限制返回类型以扩展预定义的已知类型,但我希望 typescript 采用返回类型的推断类型(因为它可能更准确)。
例如,假设所有函数都必须返回字符串,因此:

type myFuncsType = (...args: any) => string
每个函数都必须扩展这种类型。
现在可以说我的函数总是返回一个常量字符串:
const myFunc1 = () => "MyString" as const
// the type is inffered:
const myVal = myFunc1()
// typeof myVal = "MyString"
我们还说过我们的函数必须扩展预定义的已知类型( myFuncsType ),但是在分配类型时,通用类型会接管推断出的准确类型,这是我想避免的:
const myFunc1: myFuncsType = () => "MyString" as const
const myVal = myFunc1()
// typeof myVal = string
我尝试用泛型解决它,但泛型需要传递预定义类型,并且在声明期间返回类型不可用。
如何限制返回类型以扩展预定义类型,但又返回从声明中推断出的确切返回类型?

最佳答案

MyFuncsType不是 union , 如果您 annotate myFunc1具有该类型的变量,编译器将始终将该变量视为该类型。它没有narrow变量基于分配给它的特定值,而是将其一直扩展到带注释的类型。所以你不想注释myFunc1 .
您真正想做的不是注释,而是检查 myFunc1可分配给 MyFuncsType ,而不加宽它。在 TypeScript 中没有内置的操作符来做到这一点;见 microsoft/TypeScript#7481对于此类功能的请求。但是您可以编写自己的辅助函数,其行为方式如下:

type MyFuncsType = (...args: any) => string
const asMyFuncsType = <T extends MyFuncsType>(t: T) => t;
所以代替 const f: MyFuncsType = ... , 你写 const f = asMyFuncsType(...)反而。 asMyFuncsType()函数只是返回它的输入而不改变它的类型,但它会检查类型是否可以分配给 MyFuncsType ,所以它会捕获错误:
const badFunc = asMyFuncsType(() => 123); // error!
// -------------------------------> ~~~
// Type 'number' is not assignable to type 'string'

const myFunc1 = asMyFuncsType(() => "MyString" as const); // okay
const myVal = myFunc1()
// typeof myVal = "MyString"
Playground link to code

关于 typescript 返回分配函数的推断类型,但限制返回类型以扩展预定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68651574/

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