Typescript 中的 const/type 模式是什么

Vik*_*mar 7 types typescript reactjs react-redux

export const INCREMENT_ENTHUSIASM = 'INCREMENT_ENTHUSIASM';
export type INCREMENT_ENTHUSIASM = typeof INCREMENT_ENTHUSIASM;


export const DECREMENT_ENTHUSIASM = 'DECREMENT_ENTHUSIASM';
export type DECREMENT_ENTHUSIASM = typeof DECREMENT_ENTHUSIASM;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我无法理解这一点。这非常令人困惑,这是来自 https://github.com/Microsoft/TypeScript-React-Starter“添加操作”部分下的内容。

我知道type关键字的作用,但这里看起来很混乱。

在此输入图像描述

Nit*_*mer 9

您发布的示例背后的想法是导出值和类型,以便您能够执行以下操作:

let myVar: INCREMENT_ENTHUSIASM;
Run Code Online (Sandbox Code Playgroud)

如果该行:

type INCREMENT_ENTHUSIASM = typeof INCREMENT_ENTHUSIASM
Run Code Online (Sandbox Code Playgroud)

缺少上述变量声明会引发错误:

找不到名称“DECRMENT_ENTHUSIASM”

Typescript 中的某些内容既是类型又是值,例如枚举和类,但接口或类型别名只是类型,在这种情况下,您也可以重用类型名称来创建值。
例如:

type MySingleton = {
    getId(): string;
    doSomething1(str: string): string;
    doSomething2(num: number): number;
}

const MySingleton: MySingleton = {
    getId: function () {
        ...
    },
    doSomething1: function(str: string): string {
        ...
    },
    doSomething2: function (num: number): number {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有关打字稿中类型/值的更多信息,请参见此处:声明合并 - 基本概念


编辑

type INCREMENT_ENTHUSIASM = typeof INCREMENT_ENTHUSIASM;
Run Code Online (Sandbox Code Playgroud)

等于:

type INCREMENT_ENTHUSIASM = "INCREMENT_ENTHUSIASM";
Run Code Online (Sandbox Code Playgroud)

这使得INCREMENT_ENTHUSIASM字符串只能是"INCREMENT_ENTHUSIASM".


Tom*_*wel 8

顺便说一句,为了避免重复(并消除可能的拼写错误),我想出了这样一个习语:

export namespace ShowIdEnum {
  export const ALWAYS = 'always';
  export const LABEL = 'label';
  export const NEVER = 'never';
};
export type ShowIdEnum = typeof ShowIdEnum[keyof typeof ShowIdEnum];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 ;)