You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/** 美国 50 州(不含 DC按州码字母序 */
export const US_STATE_ENTRIES = [
{ code: "AL", name: "Alabama" },
{ code: "AK", name: "Alaska" },
{ code: "AZ", name: "Arizona" },
{ code: "AR", name: "Arkansas" },
{ code: "CA", name: "California" },
{ code: "CO", name: "Colorado" },
{ code: "CT", name: "Connecticut" },
{ code: "DE", name: "Delaware" },
{ code: "FL", name: "Florida" },
{ code: "GA", name: "Georgia" },
{ code: "HI", name: "Hawaii" },
{ code: "ID", name: "Idaho" },
{ code: "IL", name: "Illinois" },
{ code: "IN", name: "Indiana" },
{ code: "IA", name: "Iowa" },
{ code: "KS", name: "Kansas" },
{ code: "KY", name: "Kentucky" },
{ code: "LA", name: "Louisiana" },
{ code: "ME", name: "Maine" },
{ code: "MD", name: "Maryland" },
{ code: "MA", name: "Massachusetts" },
{ code: "MI", name: "Michigan" },
{ code: "MN", name: "Minnesota" },
{ code: "MS", name: "Mississippi" },
{ code: "MO", name: "Missouri" },
{ code: "MT", name: "Montana" },
{ code: "NE", name: "Nebraska" },
{ code: "NV", name: "Nevada" },
{ code: "NH", name: "New Hampshire" },
{ code: "NJ", name: "New Jersey" },
{ code: "NM", name: "New Mexico" },
{ code: "NY", name: "New York" },
{ code: "NC", name: "North Carolina" },
{ code: "ND", name: "North Dakota" },
{ code: "OH", name: "Ohio" },
{ code: "OK", name: "Oklahoma" },
{ code: "OR", name: "Oregon" },
{ code: "PA", name: "Pennsylvania" },
{ code: "RI", name: "Rhode Island" },
{ code: "SC", name: "South Carolina" },
{ code: "SD", name: "South Dakota" },
{ code: "TN", name: "Tennessee" },
{ code: "TX", name: "Texas" },
{ code: "UT", name: "Utah" },
{ code: "VT", name: "Vermont" },
{ code: "VA", name: "Virginia" },
{ code: "WA", name: "Washington" },
{ code: "WV", name: "West Virginia" },
{ code: "WI", name: "Wisconsin" },
{ code: "WY", name: "Wyoming" },
] as const;
export type UsStateCode = (typeof US_STATE_ENTRIES)[number]["code"];
export type UsStateEntry = (typeof US_STATE_ENTRIES)[number];
export const US_STATES: UsStateCode[] = US_STATE_ENTRIES.map((s) => s.code);
const CODE_SET = new Set<string>(US_STATES);
const NAME_TO_CODE = new Map(
US_STATE_ENTRIES.map((s) => [s.name.toLowerCase(), s.code]),
);
export function formatUsStateOption(entry: UsStateEntry): string {
return `${entry.code}${entry.name}`;
}
/** 按州码或英文全名过滤;空查询返回全部 50 州 */
export function filterUsStateOptions(query: string): UsStateEntry[] {
const q = query.trim().toLowerCase();
if (!q) return [...US_STATE_ENTRIES];
return US_STATE_ENTRIES.filter(
(s) =>
s.code.toLowerCase().startsWith(q) ||
s.name.toLowerCase().includes(q),
);
}
/** 将手写州码/州名规范为 2 位州码;无法识别时返回 null */
export function normalizeUsStateCode(input: string): UsStateCode | null {
const trimmed = input.trim();
if (!trimmed) return null;
const upper = trimmed.toUpperCase();
if (/^[A-Z]{2}$/.test(upper) && CODE_SET.has(upper)) {
return upper as UsStateCode;
}
const byName = NAME_TO_CODE.get(trimmed.toLowerCase());
return byName ?? null;
}
export function isValidUsStateCode(code: string): code is UsStateCode {
return CODE_SET.has(code.trim().toUpperCase());
}