إصدار TypeScript: 2.1.0-dev.20160912
الشفرة
// A *self-contained* demonstration of the problem follows...
const types = {
test: <'test'>'test',
test2: 'test2' as 'test2'
} // type: {test: string, test2:string}
let a = <'test'>'test' // type string
ربما تتعلق بـ: https://github.com/Microsoft/TypeScript/pull/10676
نعم ، هذا متعلق بـ # 10676. في السابق ، كان للسلسلة الحرفية نوع حرفي فقط في "سياقات حرفية" معينة (مثل ما بعد تأكيد النوع) وكنا نستخدم النوع الدقيق للتعبير كنوع مستنتج من الخاصية الحرفية للكائن. الآن ، دائمًا ما تحتوي القيم الحرفية للسلسلة على أنواع حرفية وبدلاً من ذلك نقوم _widen_ بالنوع عندما يتم استنتاجها للمواقع القابلة للتغيير (مثل الخصائص الحرفية للكائن). لذلك ، في المثال الخاص بك ، تأكيدات النوع ليس لها أي تأثير (أ) لأن الجمل الحرفية هي بالفعل من أنواع حرفية و (ب) لأننا نوسع نتيجة التعبير بالكامل بعد تأكيد النوع.
من أجل توافق أفضل مع الإصدارات السابقة ، يمكننا التفكير في _not_ توسيع نوع مستنتج عندما يكون تعبير المُهيئ تأكيدًا على النوع. بعد كل شيء ، ما هو الهدف من نوع التأكيد خلاف ذلك؟
ahejlsberg شكرا لك على الرد.
سيكون من الرائع أن تفكر في _not_ توسيع نوع مستنتج عندما يكون تعبير التهيئة عبارة عن تأكيد نوع - وتوافق - هذا نوع من نقطة تأكيد النوع :)
حالة شائعة أخرى ستتوقف عن العمل بدونها هي:
function test(style: { align: 'left' | 'right', size: number }) {
}
const style = {
align: 'left' as 'left',
size: 5
}
test(style)
بناء الجملة للأنواع الحرفية https://github.com/Microsoft/TypeScript/issues/10195 سيساعد - لكنني لست متأكدًا مما إذا كان سيصبح حقيقة.
شكرا جزيلا على كل شيء
wallverb متفق عليه ، سيكون من الجيد أن يكون لديك _some_ شكل من بناء الجملة للإشارة إلى أنك لا تريد التوسيع دون الحاجة إلى تحديد النوع صراحةً. ولكن بغض النظر ، لأسباب التوافق العكسي ، يجب أن نسمح لتأكيدات النوع بأن يكون لها هذا المعنى.
التعليق الأكثر فائدة
wallverb متفق عليه ، سيكون من الجيد أن يكون لديك _some_ شكل من بناء الجملة للإشارة إلى أنك لا تريد التوسيع دون الحاجة إلى تحديد النوع صراحةً. ولكن بغض النظر ، لأسباب التوافق العكسي ، يجب أن نسمح لتأكيدات النوع بأن يكون لها هذا المعنى.