typescript 编译器不理解条件返回类型

qzlgjiam  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(83)

我做了一些搜索,但无法找到任何确凿的我的问题。对不起,如果这是一个重复,我会很高兴,如果你重定向我。
我的问题是我为我正在做的项目写了一个store类。它有一个像这样的函数:

public getStore(store: 'FIELD1' | 'FIELD2'): State<typeof store> {
 return this[store];
}

与文件中相应的条件类型:

export type State<T> = T extends 'FIELD1'
  ? Field1Type[]
  : T extends 'FIELD2'
  ? Date
  : never;

我期望这会导致在我编写getStore('FIELD1').length时,返回值可以是Field1Type[] | Date的编译消息,但它没有。
这对我来说很不方便,因为我正在编写一个Angular应用程序,并希望在组件的HTML中调用它,而不需要在组件的脚本中使用helper。
这是正常的,还是我做错了什么?

b4lqfgs4

b4lqfgs41#

正如目前所写的,你的方法返回一个Date | Field1Type[]的联合。联合类型意味着该方法可以返回DateField1Type[],而不考虑输入,因此不允许访问length属性。
您应该考虑使用重载来将返回类型与输入相关联:

getStore(store: 'FIELD1'): Field1Type[] 
getStore(store: 'FIELD2'): Date
getStore(store: 'FIELD1' | 'FIELD2'): Date | Field1Type[] {
 return this[store];
}

如果依赖于泛型类型State的实现,也可以在这里使用它。

getStore<T extends 'FIELD1' | 'FIELD2'>(store: T): State<T>
getStore(store: 'FIELD1' | 'FIELD2'): Date | Field1Type[] {
 return this[store];
}

export type State<T> = T extends 'FIELD1'
  ? Field1Type[]
  : T extends 'FIELD2'
  ? Date
  : never;

您还应该考虑将State的实现替换为更简单的类似于map的结构:

export type State<T extends string> = ({
  FIELD1: Field1Type[]
  FIELD2: Date
} & Record<string, never>)[T]

相关问题