Можно ли создать тип в машинописи, который представляет все строки, кроме набора строковых литералов? - PullRequest
0 голосов
/ 02 февраля 2019

Я хотел бы использовать перегрузку машинописного текста для обеспечения смысла для функции, которую я пишу.Подписи отличаются только типом параметра.У меня проблема в том, что если кто-то передает что-то, совпадающее с param1 в первой перегрузке, а param2 - нет, то оно переходит к общей перегрузке.Я хотел бы, чтобы это не было принято, и чтобы intellisense пометил его как ошибку.

Я пытался использовать условную типизацию с помощью Exclude <>, которая не работала.

type Exclusion = "Invalid";
type ExcludeString = Exclude<string, Exclusion>;

func(param1: "Activate", param2: (value: SomeInterface) => any): void;
func(param1: ExcludeString, param2: (value: any) => any): void;

Когда я звоню func("Activate", (value: NotSomeInterface) => console.log("Invalid"));, я бы хотел, чтобы intellisense сообщал пользователю об ошибке.Вместо этого ничего не происходит из-за провала.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы не можете определить тип напрямую, Exclude<string, Exclusion> на самом деле просто приведет к тому, что string машинописный текст на самом деле не имеет понятия отрицательного типа.Есть предложение разрешить нечто подобное ( Здесь ), но оно еще не является частью языка (на момент написания 3.3 - последняя версия).

Все это, как говорится, мыможет получить аналогичный эффект, если речь идет о параметре функции, который не должен иметь определенного значения.Для этого нам понадобится параметр универсального типа для захвата фактического типа передаваемой строки. Затем мы можем ввести параметр как Exclude<T, Exclusion>, и это приведет к ожидаемым ошибкам:

type Exclusion = "Invalid";
type ExcludeString = Exclude<string, Exclusion>;

function func<T extends string>(param1: Exclude<T, Exclusion>): void {

} 

func("SS")
func("Invalid") // error
...