ts 里类似 golang 这种写法怎么实现?

154 天前
 imherer

假如我现在有一个status,它的值是数字,但是需要有一个中文的说明,于是在 golang 里可以这样写

go:
type Status int

const Success Status = 1
const Failed Status = 2

func (s Success) ToString() string{
	return "成功"
}
func (s Failed) ToString() string{
	return "失败"
}

在使用的时候,如果我想要字符串的说明直接 Success.ToString()就行了

ts 里有类似的实现吗?

我现在是这样写的

ts:
export enum Status {
  Success = { id: 1, value: "成功" },
  Failed = { id: 2, value: "失败" },
}

使用:Status.Success.value

2751 次点击
所在节点    程序员
22 条回复
lysShub
154 天前
go 是这样写的

//go:generate stringer -linecomment -output status_gen.go -type=Status
type Status int

const (
_ Status = iota
Success // 成功
Failed // 失败
)
8E9aYW8oj31rnbOK
154 天前
我问了一下克劳德

在 TypeScript 中,您可以通过几种方式来实现类似 Golang 的功能。以下是一些可能的方法:

1. 使用枚举和命名空间结合:

```typescript
enum StatusEnum {
Success = 1,
Failed = 2
}

namespace Status {
export const Success = StatusEnum.Success;
export const Failed = StatusEnum.Failed;

export function toString(status: StatusEnum): string {
switch (status) {
case StatusEnum.Success:
return "成功";
case StatusEnum.Failed:
return "失败";
default:
return "未知";
}
}
}

// 使用
console.log(Status.toString(Status.Success)); // 输出:成功
```

2. 使用类和静态方法:

```typescript
class Status {
static readonly Success = new Status(1, "成功");
static readonly Failed = new Status(2, "失败");

private constructor(public readonly id: number, public readonly value: string) {}

toString(): string {
return this.value;
}
}

// 使用
console.log(Status.Success.toString()); // 输出:成功
console.log(Status.Failed.value); // 输出:失败
```

3. 使用对象和函数:

```typescript
const Status = {
Success: 1,
Failed: 2,
toString(status: number): string {
switch (status) {
case Status.Success:
return "成功";
case Status.Failed:
return "失败";
default:
return "未知";
}
}
} as const;

// 使用
console.log(Status.toString(Status.Success)); // 输出:成功
```

4. 使用 Symbol 和对象:

```typescript
const Status = {
Success: Symbol('Success'),
Failed: Symbol('Failed'),
toString(status: symbol): string {
switch (status) {
case Status.Success:
return "成功";
case Status.Failed:
return "失败";
default:
return "未知";
}
}
};

// 使用
console.log(Status.toString(Status.Success)); // 输出:成功
```

这些方法中,第 2 种(使用类和静态方法)可能最接近您的 Golang 示例。它允许您使用`Status.Success.toString()`来获取字符串描述,同时保持了类型安全性。

选择哪种方法取决于您的具体需求和偏好。每种方法都有其优点和适用场景。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1057893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX