Рассмотрим код ниже (работает в TypeScript 3.2.2):
const status: 'successful' | 'failed' = 'successful';
function test(): typeof status {
const status = 'hello';
return 'successful';
}
Не компилируется, поскольку тип возвращаемого значения test
и его подпись не совпадают:
error TS2322: Type '"successful"' is not assignable to type 'IResult<"hello">'.
По некоторым причинам status
определение внутри функция используется для определения типа возвращаемого значения.
Этого не происходит при использовании var
; этот код:
function test(): typeof status {
var status = 'hello'; // notice the var here
return 'successful';
}
создает ожидаемый тип возврата 'successful' | 'failed'
.
Использование let
:
function test(): typeof status {
let status = 'hello'; // notice the let here
return 'successful';
}
Компилируется, но с учетом того, что тип возвращаемого значения равен string
, внутреннее определение используется снова.
Я ожидал, что tsc
будет использовать status
, который определен наиболее высоко в областях для оценки его возвращаемого типа в обоих случаях, независимо от того, какие объявления существуют внутри test
. Почему такое поведение наблюдается выше? Это должно быть связано с тем, как tsc
решает, какие переменные использовать для вывода типа.