2016-04-05 1 views
10

В машинописном машинописном тексте 1.8 введен строковый литерал. Тем не менее, при прохождении в объекте в качестве параметра, как показано ниже:Литература строковой строки с утиным типом объекта

const test = { 
    a: "hi", 
    b: "hi", 
    c: "hi" 
}; 

interface ITest { 
    a: "hi" | "bye" 
} 

function testFunc (t: ITest) { 

} 

testFunc(test); 

Это терпит неудачу с:

аргумент типа «{а: строки; b: строка; c: string; } 'не присваивается параметру типа «ITest». Виды собственности «а» несовместимы. Тип 'string' не присваивается типу '"hi" | "пока"'. Тип 'string' не присваивается типу '' bye ''.

Я ожидаю, что это сработает, так как оно отвечает требованиям интерфейса, но я могу что-то игнорировать.

+0

a, b и c являются строковыми типами в тесте и «привет» | тип «bye» в вашем интерфейсе. – nullforce

+0

Это имеет смысл, хотя это немного противоречит интуитивному. Благодарю. –

ответ

12

Тип 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 
Смежные вопросы