إصدار TypeScript: 2.0.3 / nightly (2.1.0-dev.201xxxxx)
2.0.3
رمز
function test(val: 'AAA'|'BBB'){
//xxx
}
let a = true ? 'AAA' : 'BBB';
test(a);
سلوك متوقع:
جمعت بنجاح
السلوك الفعلي:
حصلت على خطأ:
خطأ TS2345: الوسيطة من النوع 'سلسلة' غير قابلة للتخصيص إلى معلمة من النوع '"AAA" | "BBB" ".
لقد نوقش هذا عدة مرات.
أولاً ، أنت تقوم بالتخصيص إلى متغير let ، مما يعني أن المترجم سيفترض أنك قد ترغب في تغيير القيمة في المستقبل ، وبالتالي لا يقوم بتعيين نوع سلسلة حرفية للمتغير.
أيضًا ، في الإصدار 2.0 ، لم يكن هناك أبدًا استنتاج للحروف. سيتعين على المطور القيام بذلك صراحة. لذلك لإصلاح هذا:
function test(val: 'AAA'|'BBB'){
//xxx
}
let a: 'AAA' | 'BBB' = true ? 'AAA' : 'BBB';
test(a);
ولكن في TypeScript 2.1 ، سوف يفسر المهام إلى const
بأكثر الطرق صرامة ، لذا يمكنك القيام بذلك على النحو التالي:
function test(val: 'AAA'|'BBB'){
//xxx
}
const a = true ? 'AAA' : 'BBB';
test(a);
التعليق الأكثر فائدة
لقد نوقش هذا عدة مرات.
أولاً ، أنت تقوم بالتخصيص إلى متغير let ، مما يعني أن المترجم سيفترض أنك قد ترغب في تغيير القيمة في المستقبل ، وبالتالي لا يقوم بتعيين نوع سلسلة حرفية للمتغير.
أيضًا ، في الإصدار 2.0 ، لم يكن هناك أبدًا استنتاج للحروف. سيتعين على المطور القيام بذلك صراحة. لذلك لإصلاح هذا:
ولكن في TypeScript 2.1 ، سوف يفسر المهام إلى
const
بأكثر الطرق صرامة ، لذا يمكنك القيام بذلك على النحو التالي: