Ответ 1
Тип test.a
был выведен как string
, а не "hi"
. Компилятор сравнивает типы, а не исходное строковое выражение.
Чтобы выполнить эту работу, вам нужно ввести это свойство как "hi" | "bye"
:
type HiBye = "hi" | "bye";
const test = {
a: "hi" as HiBye,
b: "hi",
c: "hi"
};
interface ITest {
a: HiBye
}
function testFunc (t: ITest) {
}
testFunc(test);
Обратите внимание, что в исходном случае для компилятора не имеет смысла выводить тип test.a
как "hi"
, потому что вы можете назначить другое значение test.a
до того, как оно достигнет testFunc(test)
-ex, test.a = "not hi"
.
Боковое примечание: хорошо, что компилятор не выводит тип, являющийся строковым выражением для даже постоянных строковых переменных. Это также привело бы к множеству неприятностей... представьте себе это:
const myVariableTypedAsHi = "hi"; // implicitly typed as "hi"
let otherVar = myVariableTypedAsHi; // otherVar implicitly typed as "hi"
otherVar = "test"; // error: cannot assign `"test"` to `"hi"`—well that would be annoying