Typescript 使用具有严格值的接口

Posted

技术标签:

【中文标题】Typescript 使用具有严格值的接口【英文标题】:Typescript use interface with strict values 【发布时间】:2019-01-07 16:08:30 【问题描述】:

我有一个 typescript/react 项目,我在其中使用 @material 组件。在@types/material__component 下有定义。 在定义中经常有类似的接口(这个来自@types/material__menu/constants.d.ts):

export interface CornerBit extends MDCNumbers 
    BOTTOM: 1;
    CENTER: 2;
    RIGHT: 4;
    FLIP_RTL: 8;

现在,如果我想在我的代码中使用 CornerBit,我会这样做:

import  CornerBit  from "@material/menu/"

@material/menu/index.js 从声明为的 constants.js 导出 CornerBit:

const CornerBit = 
  BOTTOM: 1,
  CENTER: 2,
  RIGHT: 4,
  FLIP_RTL: 8,
;

现在,当我将上面写的 CornerBit 导入我的文件并尝试这样做时:

const MyCornerBit = CornerBit;

我明白了:

TS2693: 'Corner' only refers to a type, but is being used as a value here.

所以我想我只是以某种方式导入接口,而不是 const 本身。我该如何使用这样的接口(所有属性都有明确的值)?

感觉完全没用:

const MyCornerBit: CornerBit = 
    BOTTOM: 1,
    CENTER: 2,
    RIGHT: 4,
    FLIP_RTL: 8,

谢谢。

【问题讨论】:

您正在尝试将 CornerBit 分配给 MyCornerBit 并且错误表明这是不正确的,因为它是一种类型。如果你想说MyCornerBitCornerBit 类型,那么使用: 而不是=。有点不清楚你想要实现什么 我试图使 MyCornerBit 成为具有上述值的对象。这样我就可以使用 MyCornerBit.BOTTOM、MyCornerBit.CENTER 等。 【参考方案1】:

您应该像这样将您的 const MyCornerBit 声明为 CornerBit

const MyCornerBit: CornerBit;

没有必要用匹配的属性来实例化这个常量

【讨论】:

当我执行const MyCornerBit: CornerBit; 时,我得到TS1155: 'const' declarations must be initialized let 声明而不是const 嗯,然后我需要禁用 tslint,因为它告诉我在未重新分配 MyCornerBit 时使用 const。但实际上是在工作。所以谢谢。不过对我来说还是有点奇怪。 好的,抱歉。它实际上不起作用。没有编译时错误或任何东西,但运行时告诉我“无法从未定义中读取 BOTTOM” 这个interface CornerBit 有可注入的装饰器吗?

以上是关于Typescript 使用具有严格值的接口的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 2.0开启空值的严格检查

具有严格接口但弱类型的代码的术语

Typescript 在具有严格编译器选项的 node_modules 中引发错误

对接收动作类型的 TypeScript reducer 进行类型检查

使用 TypeScript 从数组中删除具有特定 id 字段值的对象的聪明方法是啥? [复制]

在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?