gpt4 book ai didi

typescript - 递归类型在 emit 声明后变为 any,需要隐式解决

转载 作者:行者123 更新时间:2023-12-04 17:09:53 24 4
gpt4 key购买 nike

我正在创建一个 npm 包,基本上它是一个返回一个对象的函数,该对象返回函数本身的返回值

export const chainCreator = () => {
return {
chain: () => {
return chainCreator()
},
end: () => {
return 'end'
},
}
}

enter image description here

到目前为止还不错,类型没问题

但是当我构建它的时候它坏了: enter image description here

它返回 any 类型,所以这是一个很大的否定

有一个解决方案,通过显式输入(类型注释)

type chainCreator = {
(): { chain: () => ReturnType<chainCreator>; end: () => string }
}
export const chainCreator: chainCreator = () => {
return {
chain: () => {
return chainCreator()
},
end: () => {
return 'end'
},
}
}

enter image description here这按预期工作,但是,我更喜欢隐式解决方案(类型推断),因为它更自动化,需要更少的维护并且更准确。

这是我的配置

{
"compilerOptions": {
"isolatedModules": true,
"module": "commonjs",
"declaration": true,
"esModuleInterop": true,
"sourceMap": true,
"noImplicitAny": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"target": "esNext",
"allowJs": true,
"baseUrl": "src",
"emitDeclarationOnly": true,
"outDir": "dist",
"paths": {
"*": ["*"]
},
"typeRoots": ["./node_modules/@types"]
},
"include": ["src/**/*"]
}

所以我的问题是,像这样的递归函数是否有任何隐式解决方案?

最佳答案

不,TypeScript 目前没有办法发出合理的 declaration file对于匿名 递归类型。 microsoft/TypeScript#463 上有一个非常古老的未解决问题讨论这个问题,虽然在 IntelliSense 中对 any 进行了一些改进(当事情太长时,你会得到那些省略号 ...),但声明文件的类型仍然只是 any

microsoft/TypeScript#44045 有建议支持自动生成type aliases在声明文件中为难以扩展的匿名类型命名,因为它们非常大或递归,因此是无限的。目前尚不清楚何时或是否会实现此类措施。给这个问题一个 👍 并没有坏处,但它可能也没有太大帮助。

直到并且除非有什么变化,你应该给匿名递归类型一个明确的名字,比如 ChainCreator 并使用它,如果你需要生成准确的声明文件。

关于typescript - 递归类型在 emit 声明后变为 any,需要隐式解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69724861/

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