javascript - 如何在 typescript 中创建一个可选的对象键字符串?

标签 javascript typescript

declare interface timezoneSyntax {
  region: string;
  en: {
    x: string;
    offset: {
      EST?: number;
      EDT?: number;
      [key: string]: number;
    };
  };
  it: {
   x: string;
  }
}

如何使以下对象成为可选的并且 en 通用?

en: {
    x: string;
    offset: {
      EST?: number;
      EDT?: number;
      [key: string]: number;
    };
  };

我试图将 en 转换为 [key: string]? 但它显示错误。请指教。

最佳答案

[key: string]: T 形式的索引可以被认为是总是可选的,所以不需要用 ? 符号来指定它。

但是,指定这样的索引签名会强制所有 接口(interface)属性具有与键相同的T 类型。例如,region 会导致

Property 'region' of type 'string' is not assignable to string index type '{ x: string; offset: { ... }; }'

这是因为索引签名 [key: string]: T 简单地规定了所有 接口(interface)属性应该是什么样子。另一种方法是使用 [key: string]: any 但你会放松你的类型安全。

据我了解,这不是您想要的副作用,因此您应该重新考虑在此界面中使用索引键并找到不同的方法。

提案

不要使用特定于语言的属性名称(enites 等),而是使用通用的语言 作为名称。如果您还需要知道您正在处理的是哪种语言,那么应该将其作为 name 添加到 language 模型中。

你最终会得到这样的结果:

declare interface timezoneSyntax {
  region: string;
  language: {
    name: string; // `en`, `it`, `es`, etc
    x: string;
    offset: {
      EST?: number;
      EDT?: number;
      [key: string]: number;
    };
  };
}

延伸阅读

Indexable Types - Official TypeScript Documentation

Index Signatures - TypeScript Deep Dive

关于javascript - 如何在 typescript 中创建一个可选的对象键字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145172/

相关文章:

angularjs - Visual Studio 2015 没有将 TypeScript 编译为 ASP.NET Core 项目的一部分?

javascript - 在 JavaScript 中获取范围随机数的最佳方法?

javascript - 导航栏淡出并返回

javascript - 如何在不使用 create-react-app 且仅使用我自己的 Webpack 的情况下设置 package.json 进行部署?

Angular 6 项目未在 IE11 中加载

javascript - 如何使用nestjs日志服务

javascript - 引导导航栏响应不工作

javascript - 替换字符串中的 n 个模式

javascript - Typescript AngularJs CommonJs 常量

typescript - 我如何查看 tsc 正在处理哪些文件?