มีวิธีตรวจสอบไหมว่าสตริงนั้นอยู่ในชนิด Union ใน TypeScript หรือไม่?
พิจารณาโค้ดต่อไปนี้:
type Foo = "Foo" | "Bar" | "Baz"
function isInFoo(str: string) boolean {
// return Foo.contains(str); ?
}
ใน TypeScript มีวิธีที่เรียบง่ายในการตรวจสอบว่า str อยู่ในประเภท Foo หรือไม่หรือไม่?
คำตอบ #1
คำอธิบายชนิดถูกลบออกจากโค้ดที่คอมไพล์แล้วและไม่สามารถใช้งานได้ในขณะรันไทม์ แต่เพื่อขยายความจากคำตอบของ Ivan นี่คือตัวอย่างของการดึงข้อมูลที่มีชนิดจากอาร์เรย์:
const fooBar = ['foo', 'bar', 'baz'] as const;
type FooBar = typeof fooBar[number]; // "foo" | "bar" | "baz"
จากนั้นคุณสามารถเขียนตัวตรวจสอบชนิดแบบกำหนดเองที่ตรวจสอบสตริงในเวลารันไทม์ได้:
function isFooBar(string: unknown): string is FooBar {
return typeof string === 'string' && string in fooBar;
}
และใช้มันแบบนี้:
const maybeFooBar: unknown = 'baz';
if (isFooBar(maybeFooBar)) {
console.log('Typescript knows this is a FooBar');
}
คำตอบ #2
type Foo จะไม่ถูกคอมไพล์ลงในจาวาสคริปต์ที่สร้างขึ้น มันไม่สามารถทำได้อย่างสวยงาม หนึ่งในตัวเลือกคือ: ใช้อาเรย์ที่มีสตริงที่ระบุ หรือเข้าถึงฟิลด์เหล่านี้ผ่าน enum
