仅允许具有 TypeScript 类型的特定字符串值

仅允许具有 TypeScript 类型的特定字符串值

Allow only specific string values with TypeScript type

使用字符串文字类型仅允许 TypeScript 类型中的特定字符串值,例如const str: 'draft' | 'sent' = 'draft';.

字符串文字允许我们引用类型位置中的特定字符串。如果指定的字符串不是文字类型,则会抛出错误。

索引.ts
// ✅ with an interface interface Person { name: 'Alice' | 'Bob' | 'Carl'; } const p: Person = { name: 'Alice', }; // ✅ with a Type Alias type Sizes = 'small' | 'medium' | 'large'; const s: Sizes = 'small';

这里还有两个例子。

索引.ts
// ✅ inline const str: 'draft' | 'sent' = 'draft'; // ✅ for function parameters function logMessage(message: 'hello world' | 'howdy world') { console.log(message); } logMessage('hello world');

这些示例展示了如何使用
字符串文字类型
来仅允许分配给特定的字符串值。

索引.ts
interface Person { name: 'Alice' | 'Bobby Hadz' | 'Carl'; } const p: Person = { name: 'Bobby Hadz', }; console.log(p.name); // 👉️ Bobby Hadz

字符串文字类型允许我们引用类型位置中的特定字符串。

分配不是文字类型成员的字符串会导致错误。

索引.ts
// ⛔️ Type '"bobbyhadz.com"' is not assignable // to type '"draft" | "sent"'. const str: 'draft' | 'sent' = 'bobbyhadz.com';

考虑字符串文字类型的一种简单方法是,它们是
具有特定字符串值而不是类型的
联合类型。

您还可以在键入函数参数时使用字符串文字类型。

索引.ts
function logMessage(message: 'hello world' | 'howdy world') { console.log(message); } // ✅ Works logMessage('hello world'); // ⛔️ Error logMessage('bobbyhadz.com');

可以使用两个字符串之一调用该函数,尝试使用任何其他值调用它会导致错误。

文字类型也可用于数字和布尔值。例如,该类型只是 union 的别名 booleantrue | false

仅允许使用枚举的 TypeScript 类型的特定字符串值

或者,您可以使用
enum

枚举允许我们定义一组命名常量。如果指定的字符串不是枚举的成员,则会抛出错误。

索引.ts
enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // ✅ using interfaces interface JobEmails { status: EmailStatus; } const obj: JobEmails = { status: EmailStatus.Read, }; // ✅ inline assignment const emailStatus: EmailStatus = EmailStatus.Read;

枚举有时比字符串文字类型更容易阅读。

Note that enums are real objects and exist at runtime. You can use dot notation to access a property on an enum.

The emailStatus variable can only have one of the 3 values that are present in
the EmailStatus enum.

An assignment of a different string would cause the type checker to throw an
error.

index.ts
enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // ⛔️ Error: Type '"bobbyhadz.com"' is not // assignable to type 'EmailStatus'.ts(2322) const emailStatus: EmailStatus = 'bobbyhadz.com';

The main advantage of using enums over string literal types is that they make
your code easier to read and organize.

The whole purpose of enums is to define a group of named and related
constants.

I’ve also written an article on
how to check if a string is in a union.

# Additional Resources

You can learn more about the related topics by checking out the following
tutorials: