Тип объединения интерфейсного поля не учитывается при проверке типа вызова перегруженной функцией - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть существующий интерфейс ICon с перегруженными функциями. У него есть функция приемника для вызовов со слабой типизацией.

Проблема в том, что когда я создаю тип объединения всех возможных перегрузок, он не учитывается, если я не использую тип на первом уровне. Он выдает ошибку компиляции Object is possibly 'undefined'.

Что я могу сделать, чтобы объединить тип в качестве поля интерфейса и все еще иметь правильную строгую типизацию?

игровая ссылка

interface ICon {
    getControl(controlName: "a"): string;
    getControl(controlName: "b"): string;
    getControl(controlName: string): undefined;
}

// # 1 -- first level local union type

type localUnionType = "a" | "b";

let a: localUnionType = "a";

let mockCon = {} as ICon;

//first level type is analyzed correctly
mockCon.getControl(a).toLocaleUpperCase();


// # 2 -- union type in an interface

interface IVal {
    val: "a" | "b"
}

let ab: IVal = {
    val: "a"
};

// # Object is possibly 'undefined'.
//inderect type does not see that it's impossible to be undefined.
let ctrl = mockCon.getControl(ab.val)
ctrl.toLocaleUpperCase();


// # 3 -- combination

interface IVal {
    val: localUnionType
}

let ab1: IVal = {
    val: "a"
};

// # Object is possibly 'undefined'.
//inderect type does not see that it's impossible to be undefined.
let ctrl1 = mockCon.getControl(ab.val)
ctrl1.toLocaleUpperCase();

1 Ответ

0 голосов
/ 15 апреля 2020

Для значения типа объединения используйте перегруженную функцию, которая принимает тип объединения:

interface ICon {
    getControl(controlName: "a" | "b"): string;
    getControl(controlName: string): undefined;
}

С подписью:

getControl(controlName: "a"): string;

controlName может быть значением литерала type "a".

Но "a" | "b" нельзя использовать, когда ожидается "a": другими словами "a" | "b" не является подтипом "a".

Typescript будет всегда отступать к:

getControl(controlName: string): undefined; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...