Tôi đang tìm kiếm một câu trả lời có thể nhận được enum
từ 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.CantTell
bằng một "Can't tell"
chuỗi, nó sẽ trả về undefined
vớ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, undefined
sẽ đượ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 any
và đá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)