TypeScript 在通过枚举属性过滤对象的联合时,声明和原始的不同类型,

lstz6jyr  于 5个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(57)

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:

jk9hmnmh

jk9hmnmh1#

我不明白你在这里做什么。沙盒链接不起作用(some1和some2为空)。index.d.ts是你手写的,还是生成的?

相关问题