gpt4 book ai didi

typescript - 为什么 TypeScript 类型推断在这种情况下会失败?

转载 作者:行者123 更新时间:2023-12-02 18:49:04 25 4
gpt4 key购买 nike

我想了解为什么类型 S1never,但是当我删除 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>;

这里发生了什么?

typescript 版本 3.7.5。在 Typescript Playground 上的工作方式相同。

最佳答案

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

情况 1:默认情况下,永远不会

When you try to extend interface TestInput with interface BaseInputProps<string> it will try to check if all the properties typing are compatible but in this case customRef?: (selfProps: this) => void; type (selfProps: this)=> void is not assignable to string and vice versa. That's why it is falsy inheritance because of which S1 is never

情况2:当你删除label和customRef时,它是字符串

When you removed label and customRef interface BaseInputProps and interface TestInput will be left out with one compulsory property value because of which it will correctly infer the typings.

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

When you removed the value and label interface BaseInputProps and interface TestInput will be left out with only optional property and typescript can't guarantee the typings in this case.

尽管如此,为什么这个改变是有意的还是一个问题。但是,看看它所涉及的规范变更的范围,我想很难看到这方面的变化。

请阅读本文以了解有关 weak typing 的更多信息以及 conditional typings .

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

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