ค้นหาเว็บไซต์

มีวิธีตรวจสอบไหมว่าสตริงนั้นอยู่ในชนิด 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

บทความที่เกี่ยวข้อง