我想了解为什么S1类型是never,但是当我删除labelcustomRef属性时,我会得到string正确的结果。当我删除valuelabel属性时,我得到unknown

export interface BaseInputProps<TStored> {
  value: TStored;
  customRef?: (selfProps: this) => void;
}

export interface TestInput extends BaseInputProps<string> {
  label: string;
}

type InferStoredType<T> = T extends BaseInputProps<infer TT> ? TT : never;

type S1 = InferStoredType<TestInput>;


这是怎么回事

打字稿版本3.7.5。在Typescript游乐场上以相同的方式工作。

最佳答案

它与结构差异和weak type有关。因此,让我们了解所有情况下的问题

情况1:默认情况下,从不


当您尝试使用interface TestInput扩展interface BaseInputProps<string>时,它将
尝试检查所有键入的属性是否兼容,但在这种情况下,不能将customRef?: (selfProps: this) => void;类型(selfProps: this)=> void分配给string,反之亦然。这就是为什么它是虚假继承的原因,因为S1是never


情况2:删除标签和customRef时,它是字符串


删除标签后,customRef interface BaseInputPropsinterface TestInput将被保留一个强制属性value,因为它可以正确推断类型。


情况3:删除值和标签时,它是未知的


删除值并标记interface BaseInputProps后,
interface TestInput将只保留可选属性,而
在这种情况下,打字稿不能保证打字。


但是,为什么要有意进行此更改仍是一个问题。但是,从规格变化的范围来看,我想很难看到变化。

请同时阅读有关weak typingconditional typings的更多信息。

关于typescript - 为什么在这种情况下TypeScript类型推断会失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60163017/

10-13 08:03