строковой литерал:
type StringLiteral<
T extends string,
U = { [K in T]: K },
V = T extends infer V ? V extends string ? { [K in V]: K } : never : never
> = V extends U ? string extends T ? never : T : never
const f = <T extends string>(t: StringLiteral<T>) => {};
f('a'); // OK
declare const ab: 'a' | 'b';
f(ab); // FAIL
declare const s: string;
f(s); // FAIL
1. Есть ли у кого-то идеи, как написать проще?
2. Кто-нибудь сможет сломать?
(Под "передаётся строковой литерал" подразумевается, что на входе может быть строка только с одним любым возможным значением, и неважно, откуда оно пришло: из переменной или вызова функции.)
Обсуждают сегодня