網站搜尋

vue.js - 在 TypeScript 中將導入的類與命名空間合併


有效:

class InputField {
  
}

namespace InputField {
  export enum Types {
    text = "text",
    number = "number"
  }
}

export { InputField };

無效:

import InputField from "@Controls/InputFields/InputField.vue";
// TS2440: Import declaration conflicts with local declaration of 'InputField'

namespace InputField {
  export enum Types {
    text = "text",
    number = "number"
  }
}

export { InputField };

我如何將 導入的 InputField 類與命名空間 InputField 合併(並重新導出)?

我將如何使用結果

import { Vue, Component, Prop } from "vue-property-decorator"
import { InputField } from "@Components/..."


@Component({
  //              Usage as namespace    ↓↓↓
  template: `<InputField type="InputField.Types.number" />`,
  components: {
    InputField // Usage as Vue component
  } 
})
export default class Application extends Vue {
  // Provide access from template
  private InputField: typeof InputField = InputField;
}

為什麼我需要這個

declare module "*.vue" {
  import Vue from "vue";
  export default Vue;
}

因此,TypeScript 無法在 .vue 檔案中看到已匯入類別的公用欄位

答案#1

你可以透過一個 *.ts 文件代理它,來規避這個 *.vue as VueConstructor<Vue> 問題:

import DefaultImportClass, {componentOptions} from "@/source/index.vue"
import {Component} from "vue-property-decorator"

@Component<exportClassName>(componentOptions)
class exportCalssName extends DefaultImportClass {} 
namespace exportClassName {}

export {exportClassName}

但是

您可以使用 static 來達到與透過命名空間完成的相同結果:

enum Types {
  Text: "text",
  Number: "number"
}

@Component
export class InputFieldTypes extends Vue {
  static Types = Types
}

答案#2

限制

@Component({
  template: `<input type="HTML_Type" />`
})
export default class InputField extends Vue {

  //              Vue will not see this !! ↓↓   
  @Prop({ default: InputField.Properties.Types.text, type: String }) 
  private readonly HTML_Type!: string;
}

namespace InputField {
  export enum Types {
    text = "text",
    number = "number"
  }
}

它可以通過靜態欄位解決。