typescript - 如何在Typescript的界面中将联合(或其他)类型设置为强制键名
问题描述
我想联合类型作为一些接口的键枚举,以便在 vscode 中进行片段化。假设一些联合类型,
// myunion.d.ts
declare module 'some_module' {
export type TargetDirectory = 'action'|'nav'|'content'
}
并为构建预设制作预定义界面
// preset.d.ts
import 'some_module'
declare module 'some_module' {
export interface BuildPreset {
...,
predefinedTarget: { [ key: TargetDirectory]: string } // Seems not work with this code, No snippet error
}
}
BuildPreset
如果我在字段中声明一些带有接口的变量predefinedTarget
,则所有值“action”、“nav”、“content”都应该存在,而其他值不应该存在。它应该像下面,
const inter1: BuildPreset = { // This is Okay
...,
predefinedTarget: {
'action': 'a/b/c/',
'nav': 'e/f/g',
'content': 'h/i/j',
}
}
const inter2: BuildPreset = { // key 'action' is missing -- ERROR
...,
predefinedTarget: {
'nav': 'A/B/C/',
'content': 'D/E/F',
}
}
const inter3: BuildPreset = { // Key 'other' is not possible - ERROR
...,
predefinedTarget: {
'action': 'a/b/c/',
'nav': 'e/f/g',
'content': 'h/i/j',
'other': 'k/l/m/'
}
}
我有很多可能的值TargetDirectory
,所以代码片段应该检查它以防止错误。我怎样才能使这成为可能同时修改myunion.d.ts
和preset.d.ts
?我想我需要完全修改这两个d.ts
文件。请帮我。
解决方案
对于联合体,语法为[key in TargetDirectory]
. 您将其写为[key: TargetDirectory]
,这是不正确的。
语法[key: ...]
是指定键应该是什么原始类型,例如string
,number
或symbol
。
type TargetDirectory = 'action' | 'nav' | 'content';
interface BuildPreset {
predefinedTarget: {
[key in TargetDirectory]: string;
}
}
const inter1: BuildPreset = { // This is Okay
predefinedTarget: {
'action': 'a/b/c/',
'nav': 'e/f/g',
'content': 'h/i/j',
}
}
const inter2: BuildPreset = { // key 'action' is missing -- ERROR
predefinedTarget: {
'nav': 'A/B/C/',
'content': 'D/E/F',
}
}
const inter3: BuildPreset = { // Key 'other' is not possible - ERROR
predefinedTarget: {
'action': 'a/b/c/',
'nav': 'e/f/g',
'content': 'h/i/j',
'other': 'k/l/m/'
}
}
您可以在文档中找到更多信息。
所以不,您不需要完全修改 2 个文件。只有 1 行preset.d.ts
可以。
推荐阅读
- python - 如何在 Python 中正确注释合作继承?
- ruby - 如何抓取 CSV 文件的某些行并将它们保存在单独的文件中
- mysql - 尽可能快地获取我的 MySQL 的第一行(也在大表上)
- lua - 这个脚本有什么问题
- javascript - 仅在显示下拉菜单时显示叠加
- paypal - 如何构建“if”语句来测试用户是否已付款(贝宝商家工具)?
- python - 如何从同一应用的另一个用户那里获取用户应用的位置
- javascript - 使用各种键读取 Javascript 对象的值
- javascript - 如何为多个调试器设置 Visual Studio Code?
- laravel - 我在输入 migrate:fresh 时犯了一个错误,它有办法恢复已删除的数据吗