TypeScript版本: 3.9.7
搜索词: declaration extends typescript different type
declaration enum property never
typescript type is not assignable to type never
代码
我相信这个bug需要通过imports来复现。
some1.ts
import { TYPE } from './index'
export type API = {
PATH: 'some1';
TYPE: TYPE.BINARY;
}
some2.ts
import { TYPE } from './index'
export type API = {
PATH: '/some2';
TYPE: TYPE.JSON;
}
// import {some1} from './some1';
// import {some2} from './some2';
export declare const enum TYPE {
BINARY = 0,
JSON = 1
}
declare type some = some1 | some2;
declare type FilterApisByType<R extends TYPE, T = some> = T extends {
TYPE: R;
} ? T : never;
export declare type test = FilterApisByType<TYPE.BINARY>;
我在过滤对象的联合类型时,根据对象的属性进行过滤。在上面的示例中,some1
变量具有TYPE
的值为TYPE.BINARY
,而some2
具有TYPE
的值为TYPE.JSON
。正确的行为应该是结果的test
类型仅为some1
,但从index.ts
检查时,它的类型会解析为never
。
我在原始代码中没有使用任何declare
,问题仍然存在。看起来MakeApi
类型是不必要的。我删除了它,问题仍然存在。我尝试通过另一个不包含枚举的属性进行过滤,似乎可以正常工作;问题消失了。看起来过滤后的属性必须具有枚举值。无论枚举是const
还是不是,都没有区别。
预期行为:
index.ts
:
实际行为:
index.d.ts
:
Playground链接:
https://codesandbox.io/s/eloquent-kalam-spyyb?file=/index.ts
我将此沙箱保存为zip文件,然后在src
目录下的IDE中打开。
相关问题:
N/A
有趣的是,如果我手动将index.d.ts
更改为最初的过滤方式(而不是像这样过滤): FilterApisByType<TYPE.BINARY>
为实际枚举值( FilterApisByType<0>
)进行过滤,那么它就可以正常工作。
编辑:
我尝试在VS Code中复制这个问题以确保这不是Intellij的问题,我能够重复到这个问题:index.ts
:
index.d.ts
:
编辑2:
我希望得到一些关于这个问题的临时解决方案的信息,因为它正在破坏我的项目。我不能直接导入.ts
文件,因为导出的类型是通过一个奇怪的webpack配置作为npm模块导入的,如果在运行tsc
之前直接导入该文件,就会抛出一个错误😕
顺便说一下,我找到了解决webpack bug的方法:hooray:
1条答案
按热度按时间jk9hmnmh1#
我不明白你在这里做什么。沙盒链接不起作用(some1和some2为空)。index.d.ts是你手写的,还是生成的?