'ไม่ทราบ' เทียบกับ 'ใด ๆ '


190

TypeScript 3.0 แนะนำunknownประเภทตาม wiki:

ไม่รู้จักตอนนี้เป็นชื่อประเภทที่สงวนไว้เนื่องจากขณะนี้เป็นประเภทที่มีอยู่แล้ว ขึ้นอยู่กับการใช้งานที่คุณไม่รู้จักคุณอาจต้องการลบการประกาศทั้งหมด (เลือกประเภทที่ไม่รู้จักที่แนะนำใหม่) หรือเปลี่ยนชื่อเป็นสิ่งอื่น

ความแตกต่างระหว่างunknownและanyคืออะไร? เมื่อไหร่ที่เราควรใช้unknownมากกว่าany?

คำตอบ:


233

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับunknownในการประชาสัมพันธ์หรือประกาศ RCแต่ส่วนสำคัญของมันคือ:

[.. ] ไม่รู้จักซึ่งเป็นประเภทที่ปลอดภัยใด ๆ สิ่งใดก็ตามที่ไม่สามารถระบุได้ แต่ไม่รู้จักไม่สามารถมอบหมายอะไรก็ได้ยกเว้นตัวมันเองและแบบอื่นที่ไม่มีการยืนยันประเภทหรือการ จำกัด การไหลของการควบคุม ในทำนองเดียวกันจะไม่อนุญาตการดำเนินการในสิ่งที่ไม่รู้จักโดยไม่ยืนยันหรือ จำกัด ให้เป็นประเภทที่เฉพาะเจาะจงกว่าก่อน

ตัวอย่างบางส่วน:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

การใช้งานที่แนะนำคือ:

มีหลายครั้งที่เราต้องการอธิบายประเภทที่มีความสามารถน้อยที่สุดใน TypeScript สิ่งนี้มีประโยชน์สำหรับ API ที่ต้องการส่งสัญญาณ“ นี่อาจเป็นค่าใด ๆ ดังนั้นคุณต้องทำการตรวจสอบบางประเภทก่อนใช้งาน” สิ่งนี้บังคับให้ผู้ใช้วิปัสสนากลับอย่างปลอดภัย


35
ทุกคนที่มาจากพื้นหลัง C # anyเป็นเหมือนdynamicและเป็นเหมือนunknown objectฉันชอบunknownเพราะมันปลอดภัยกว่า แม้ว่าชื่อที่สับสน
nawfal

1
ฉันไม่ทราบว่านี่เป็นงานที่ยุติธรรมในการเปรียบเทียบunknownและobject@nawfal แม้ว่าฉันคิดว่าฉันเห็นสิ่งที่คุณได้รับในแง่ของความแปรปรวนและความแปรปรวนร่วม (เช่นวัตถุใด ๆ ที่สามารถกำหนดให้พิมพ์objectแม้ว่าunknownวัตถุหรือวัตถุดั้งเดิมอาจกำหนด - ในทำนองเดียวกันunknownสามารถกำหนดให้กับanyตัวเองหรือและobjectสามารถกำหนดให้dynamicหรือตัวเอง) ในบันทึกด้านข้างฉันไม่ชัดเจนว่าทำไมเอกสาร TS อ้างถึงunknownเป็นประเภทที่ดีที่สุดเพราะมันไม่ได้มีทุกประเภท¯_ (ツ) _ / ¯
Jordan

38

ความแตกต่างระหว่างที่ไม่รู้จักและสิ่งใดก็ตามที่อธิบายไว้เป็น:

ชอบมากanyค่าใด ๆ ที่กำหนดให้unknown; อย่างไรก็ตามแตกต่างจากที่anyคุณไม่สามารถเข้าถึงคุณสมบัติใด ๆ กับค่าที่มีประเภทunknownและคุณไม่สามารถโทร / สร้างพวกเขา นอกจากนี้ค่าชนิดunknownเดียวที่สามารถกำหนดให้หรือunknownany

เพื่อตอบคำถามของคุณว่าควรใช้unknownเมื่อใดany:

สิ่งนี้มีประโยชน์สำหรับ API ที่ต้องการส่งสัญญาณ“ นี่อาจเป็นค่าใด ๆ ดังนั้นคุณต้องทำการตรวจสอบบางประเภทก่อนใช้งาน” สิ่งนี้บังคับให้ผู้ใช้วิปัสสนาคืนค่าที่ปลอดภัย

ดูตัวอย่างประกาศ TypeScript 3.0สำหรับตัวอย่างของการตรวจสอบประเภทของตัวแปรunknownและคำอธิบายเพิ่มเติมโดยละเอียด


21

any พิมพ์:

anyประเภทแทนค่า JS เป็นไปได้ทั้งหมด ทุกประเภทสามารถกำหนดให้พิมพ์anyได้ ดังนั้นประเภทanyจึงเป็น supertype สากลของระบบประเภท คอมไพเลอร์ทีเอสจะช่วยให้การดำเนินการใด ๆ anyเกี่ยวกับค่าพิมพ์ ตัวอย่างเช่น:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

ในหลาย ๆ ครั้งนี่เป็นเรื่องอ่อนโยนเกินไปสำหรับคอมไพเลอร์ TS นั่นคือจะช่วยให้การดำเนินงานที่เราอาจจะรู้ว่าเป็นผลให้เกิดข้อผิดพลาด runtime

unknown พิมพ์:

unknownประเภทหมายถึง (เช่นเดียวany) เป็นไปได้ที่ค่า JS ทั้งหมด ทุกประเภทสามารถกำหนดให้พิมพ์unknownได้ ดังนั้นประเภทunknownจึงเป็น supertype สากลอื่นของระบบประเภท (ด้านข้างany) แต่คอมไพเลอร์ทีเอสจะไม่อนุญาตให้มีการดำเนินการใด ๆ unknownกับค่าพิมพ์ นอกจากนี้unknownประเภทสามารถกำหนดให้กับประเภทanyได้เท่านั้น ตัวอย่างจะอธิบายสิ่งนี้:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.