Enum
Pembuatan enum otomatis dari konstanta Go
Binding Enum
Generator binding Wails v3 secara otomatis mendeteksi tipe konstanta Go dan menghasilkan enum TypeScript atau objek const JavaScript. Tidak perlu registrasi maupun konfigurasi — cukup definisikan tipe dan konstanta Anda di Go, lalu generator akan menangani sisanya.
Mulai Cepat
Definisikan tipe bernama dengan konstanta di Go:
type Status string
const (
StatusActive Status = "active"
StatusPending Status = "pending"
StatusClosed Status = "closed"
)Gunakan tipe tersebut dalam struct atau metode layanan:
type Ticket struct {
ID int `json:"id"`
Title string `json:"title"`
Status Status `json:"status"`
}Buat binding:
wails3 generate bindings
Output generator akan melaporkan jumlah enum bersama jumlah model:
3 Enums, 5 ModelsGunakan di frontend Anda:
import { Ticket, Status } from './bindings/changeme/models'
const ticket = new Ticket({
id: 1,
title: "Bug report",
status: Status.StatusActive
})Selesai! Tipe enum diberlakukan di Go maupun JavaScript/TypeScript.
Mendefinisikan Enum
Enum di Wails adalah tipe bernama dengan tipe dasar sederhana, yang dipadukan dengan deklarasi const bertipe tersebut.
Enum String
// Title is a title
type Title string
const (
// Mister is a title
Mister Title = "Mr"
Miss Title = "Miss"
Ms Title = "Ms"
Mrs Title = "Mrs"
Dr Title = "Dr"
)TypeScript yang dihasilkan:
/**
* Title is a title
*/
export enum Title {
/**
* The Go zero value for the underlying type of the enum.
*/
$zero = "",
/**
* Mister is a title
*/
Mister = "Mr",
Miss = "Miss",
Ms = "Ms",
Mrs = "Mrs",
Dr = "Dr",
}JavaScript yang dihasilkan:
/**
* Title is a title
* @readonly
* @enum {string}
*/
export const Title = {
/**
* The Go zero value for the underlying type of the enum.
*/
$zero: "",
/**
* Mister is a title
*/
Mister: "Mr",
Miss: "Miss",
Ms: "Ms",
Mrs: "Mrs",
Dr: "Dr",
};Enum Bilangan Bulat
type Priority int
const (
PriorityLow Priority = 0
PriorityMedium Priority = 1
PriorityHigh Priority = 2
)TypeScript yang dihasilkan:
export enum Priority {
/**
* The Go zero value for the underlying type of the enum.
*/
$zero = 0,
PriorityLow = 0,
PriorityMedium = 1,
PriorityHigh = 2,
}Enum Alias Tipe
Alias tipe Go (=) juga didukung, tetapi menghasilkan output yang sedikit berbeda — definisi tipe beserta objek const, bukan enum TypeScript native:
// Age is an integer with some predefined values
type Age = int
const (
NewBorn Age = 0
Teenager Age = 12
YoungAdult Age = 18
// Oh no, some grey hair!
MiddleAged Age = 50
Mathusalem Age = 1000 // Unbelievable!
)TypeScript yang dihasilkan:
/**
* Age is an integer with some predefined values
*/
export type Age = number;
/**
* Predefined constants for type Age.
* @namespace
*/
export const Age = {
NewBorn: 0,
Teenager: 12,
YoungAdult: 18,
/**
* Oh no, some grey hair!
*/
MiddleAged: 50,
/**
* Unbelievable!
*/
Mathusalem: 1000,
};JavaScript yang dihasilkan:
/**
* Age is an integer with some predefined values
* @typedef {number} Age
*/
/**
* Predefined constants for type Age.
* @namespace
*/
export const Age = {
NewBorn: 0,
Teenager: 12,
YoungAdult: 18,
/**
* Oh no, some grey hair!
*/
MiddleAged: 50,
/**
* Unbelievable!
*/
Mathusalem: 1000,
};Nilai $zero
Setiap enum bertipe bernama menyertakan anggota khusus $zero yang merepresentasikan nilai nol Go untuk tipe dasarnya:
| Tipe Dasar | Nilai $zero |
|---|---|
string |
"" |
int, int8, int16, int32, int64 |
0 |
uint, uint8, uint16, uint32, uint64 |
0 |
float32, float64 |
0 |
bool |
false |
Saat sebuah field struct menggunakan tipe enum dan tidak ada nilai yang diberikan, constructor secara default menggunakan $zero:
export class Person {
"Title": Title;
constructor($$source: Partial<Person> = {}) {
if (!("Title" in $$source)) {
this["Title"] = Title.$zero; // defaults to ""
}
Object.assign(this, $$source);
}
}Hal ini memastikan inisialisasi yang aman secara tipe saat menghasilkan class — field enum tidak pernah bernilai undefined. Saat menghasilkan interface TypeScript (menggunakan -i), tidak ada constructor dan field dapat tidak disertakan seperti biasa.
Menggunakan Enum dalam Struct
Saat sebuah field struct memiliki tipe enum, kode yang dihasilkan mempertahankan tipe tersebut alih-alih kembali menggunakan tipe primitif:
type Person struct {
Title Title
Name string
Age Age
}TypeScript yang dihasilkan:
export class Person {
"Title": Title;
"Name": string;
"Age": Age;
constructor($$source: Partial<Person> = {}) {
if (!("Title" in $$source)) {
this["Title"] = Title.$zero;
}
if (!("Name" in $$source)) {
this["Name"] = "";
}
if (!("Age" in $$source)) {
this["Age"] = 0;
}
Object.assign(this, $$source);
}
}Field Title diberi tipe Title, bukan string. Dengan demikian, IDE Anda menyediakan pelengkapan otomatis dan pemeriksaan tipe sepenuhnya untuk nilai enum.
Enum dari Paket yang Diimpor
Enum yang didefinisikan dalam paket terpisah didukung sepenuhnya. Enum tersebut dihasilkan dalam direktori paket yang sesuai:
// services/types.go
package services
type Title string
const (
Mister Title = "Mr"
Miss Title = "Miss"
Ms Title = "Ms"
)// main.go
package main
import "myapp/services"
func (*GreetService) Greet(name string, title services.Title) string {
return "Hello " + string(title) + " " + name
}Enum Title dihasilkan dalam file model services, dan path impor ditentukan secara otomatis:
// bindings/changeme/services/models.ts
export enum Title {
$zero = "",
Mister = "Mr",
Miss = "Miss",
Ms = "Ms",
}Metode Enum
Anda dapat menambahkan metode ke tipe enum di Go. Metode tersebut tidak memengaruhi pembuatan binding, tetapi menyediakan fungsionalitas sisi server yang berguna:
type Title string
func (t Title) String() string {
return string(t)
}
const (
Mister Title = "Mr"
Miss Title = "Miss"
)Enum yang dihasilkan tetap identik, baik ada maupun tidak ada metode Go pada tipe tersebut.
Komentar dan Dokumentasi
Generator mempertahankan komentar Go sebagai JSDoc dalam output yang dihasilkan:
- Komentar tipe menjadi komentar dokumentasi enum
- Komentar grup const menjadi pemisah bagian
- Komentar pada masing-masing const menjadi komentar dokumentasi anggota
- Komentar inline dipertahankan jika memungkinkan
Dengan demikian, IDE Anda akan menampilkan dokumentasi nilai enum saat penunjuk diarahkan ke nilai tersebut.
Tipe Dasar yang Didukung
Generator binding mendukung enum dengan tipe dasar Go berikut:
| Tipe Go | Berfungsi sebagai Enum |
|---|---|
string |
Ya |
int, int8, int16, int32, int64 |
Ya |
uint, uint8, uint16, uint32, uint64 |
Ya |
float32, float64 |
Ya |
byte (uint8) |
Ya |
rune (int32) |
Ya |
bool |
Ya |
complex64, complex128 |
Tidak |
Keterbatasan
Berikut ini tidak didukung untuk pembuatan enum:
- Tipe generik — Parameter tipe mencegah pendeteksian konstanta
- Tipe dengan
json.Marshaleratauencoding.TextMarshalerkustom — Serialisasi kustom berarti nilai yang dihasilkan mungkin tidak sesuai dengan perilaku saat runtime, sehingga generator melewati tipe tersebut - Konstanta yang nilainya tidak dapat dievaluasi atau direpresentasikan secara statis — Konstanta harus memiliki nilai yang diketahui dan dapat direpresentasikan dalam tipe dasarnya. Pola
iotastandar dapat digunakan tanpa masalah karena compiler menguraikannya menjadi nilai konkret - Tipe bilangan kompleks —
complex64dancomplex128tidak dapat menjadi tipe dasar enum
Contoh Lengkap
Go:
package main
import (
"github.com/wailsapp/wails/v3/pkg/application"
)
// BackgroundType defines the type of background
type BackgroundType string
const (
BackgroundSolid BackgroundType = "solid"
BackgroundGradient BackgroundType = "gradient"
BackgroundImage BackgroundType = "image"
)
type BackgroundConfig struct {
Type BackgroundType `json:"type"`
Value string `json:"value"`
}
type ThemeService struct{}
func (*ThemeService) GetBackground() BackgroundConfig {
return BackgroundConfig{
Type: BackgroundSolid,
Value: "#ffffff",
}
}
func (*ThemeService) SetBackground(config BackgroundConfig) error {
// Apply background
return nil
}
func main() {
app := application.New(application.Options{
Services: []application.Service{
application.NewService(&ThemeService{}),
},
})
app.Window.New()
app.Run()
}Frontend (TypeScript):
import { GetBackground, SetBackground } from './bindings/changeme/themeservice'
import { BackgroundConfig, BackgroundType } from './bindings/changeme/models'
// Get current background
const bg = await GetBackground()
// Check the type using enum values
if (bg.type === BackgroundType.BackgroundSolid) {
console.log("Solid background:", bg.value)
}
// Set a new background
await SetBackground(new BackgroundConfig({
type: BackgroundType.BackgroundGradient,
value: "linear-gradient(to right, #000, #fff)"
}))Frontend (JavaScript):
import { GetBackground, SetBackground } from './bindings/changeme/themeservice'
import { BackgroundConfig, BackgroundType } from './bindings/changeme/models'
// Use enum values for type-safe comparisons
const bg = await GetBackground()
switch (bg.type) {
case BackgroundType.BackgroundSolid:
applySolid(bg.value)
break
case BackgroundType.BackgroundGradient:
applyGradient(bg.value)
break
case BackgroundType.BackgroundImage:
applyImage(bg.value)
break
}Langkah Berikutnya
Struct, pemetaan tipe, dan pembuatan model.
Hubungkan metode Go ke frontend.
Direktif, injeksi kode, dan ID kustom.
Pola desain binding.
Ada pertanyaan? Tanyakan di Discord atau lihat contoh binding.