Tôi đang tìm kiếm một câu trả lời có thể nhận được enumtừ a string, nhưng trong trường hợp của tôi, các giá trị enums có các giá trị chuỗi khác nhau. OP có một enum đơn giản cho Color, nhưng tôi có một cái gì đó khác:
enum Gender {
Male = 'Male',
Female = 'Female',
Other = 'Other',
CantTell = "Can't tell"
}
Khi bạn cố gắng giải quyết Gender.CantTellbằng một "Can't tell"chuỗi, nó sẽ trả về undefinedvới câu trả lời ban đầu.
Một câu trả lời khác
Về cơ bản, tôi đã đưa ra một câu trả lời khác, được truyền cảm hứng mạnh mẽ bởi câu trả lời này :
export const stringToEnumValue = <ET, T>(enumObj: ET, str: string): T =>
(enumObj as any)[Object.keys(enumObj).filter(k => (enumObj as any)[k] === str)[0]];
Ghi chú
- Chúng tôi lấy kết quả đầu tiên của
filter, giả sử khách hàng được thông qua một chuỗi hiệu lực kể từ enum. Nếu không phải như vậy, undefinedsẽ được trả lại.
- Chúng tôi đúc
enumObjđến any, bởi vì với nguyên cảo 3.0 trở lên (hiện đang sử dụng nguyên cảo 3.5), các enumObjđã được giải quyết như unknown.
Ví dụ về sử dụng
const cantTellStr = "Can't tell";
const cantTellEnumValue = stringToEnumValue<typeof Gender, Gender>(Gender, cantTellStr);
console.log(cantTellEnumValue); // Can't tell
Lưu ý: Và, như ai đó đã chỉ ra trong một bình luận, tôi cũng muốn sử dụng noImplicitAny.
Phiên bản cập nhật
Không có diễn viên anyvà đánh máy thích hợp.
export const stringToEnumValue = <T, K extends keyof T>(enumObj: T, value: string): T[keyof T] | undefined =>
enumObj[Object.keys(enumObj).filter((k) => enumObj[k as K].toString() === value)[0] as keyof typeof enumObj];
Ngoài ra, phiên bản cập nhật có cách gọi dễ dàng hơn và dễ đọc hơn:
stringToEnumValue(Gender, "Can't tell");
--noImplicitAny(trong VS không được chọn "Cho phép ẩn 'bất kỳ loại nào"). Nó tạo raerror TS7017: Index signature of object type implicitly has an 'any' type.cho tôi cái này hoạt động:var color: Color = (<any>Color)[green];(đã thử nghiệm với phiên bản 1.4)