首页 > 解决方案 > 如何在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.tspreset.d.ts?我想我需要完全修改这两个d.ts文件。请帮我。

标签: typescript

解决方案


对于联合体,语法为[key in TargetDirectory]. 您将其写为[key: TargetDirectory],这是不正确的。

语法[key: ...]是指定键应该是什么原始类型,例如string,numbersymbol

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/'
  }
}

在 TypeScript 操场上演示

您可以在文档中找到更多信息。

所以不,您不需要完全修改 2 个文件。只有 1 行preset.d.ts可以。


推荐阅读