จะประกาศประเภทในสัญญาลูกโซ่ลูกศรอ้วนได้อย่างไร

ฉันค่อนข้างใหม่กับไวยากรณ์ของ TypeScript ทำงานกับโค้ดที่มีอยู่ดังนี้:

private checkUsername(username: FormControl): boolean {
  return this.userService
    .findUser(username.value)
    .catch(error => this.displayError(error));
}

TypeScript linter เตือนว่า พารามิเตอร์ error เป็นประเภท any โดยปริยาย ยุติธรรมเพียงพอ แต่เมื่อฉันพยายามเพิ่มสิ่งที่ฉันคิดว่าดูเหมือนการประกาศประเภทภายในลูกศรอ้วน:

.catch(error:any => this.displayError(error));

linter เตือนว่าคาดว่า , จะมาแทนที่ :

ฉันสามารถระงับข้อผิดพลาดได้โดยล้อมพารามิเตอร์และพิมพ์การประกาศในวงเล็บ:

.catch((error:any) => this.displayError(error));

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

(ทั้ง ความหมายของ =› ใน TypeScript คืออะไร (Fat Arrow) หรือ คืออะไร ความหมายของ =› (ลูกศรที่เกิดจากเท่ากับ & มากกว่า) ใน JavaScript? มีประโยชน์อย่างยิ่ง)


person msanford    schedule 23.09.2016    source แหล่งที่มา
comment
มันไม่เกี่ยวอะไรกับคำสัญญาเลยใช่ไหม? ฉันไม่แน่ใจว่าทำไมถึงมีแท็กหรือคำในชื่อ...   -  person Heretic Monkey    schedule 23.09.2016
comment
@ MikeMcCaughan เนื่องจากฉันไม่เคยทำสิ่งนี้มาก่อนฉันจึงไม่ทราบแน่ชัดว่ามันเกี่ยวข้องกับการอยู่ในห่วงโซ่สัญญาหรือไม่ หากไม่เป็นเช่นนั้น นั่นเป็นข้อมูลที่เป็นประโยชน์ ขอบคุณ.   -  person msanford    schedule 23.09.2016


คำตอบ (3)


คุณสามารถใช้อย่างใดอย่างหนึ่งเหล่านี้ใน TypeScript:

.catch(error => this.displayError(error));

or

.catch((error: any) => this.displayError(error));

อย่างไรก็ตาม สิ่งนี้ไม่ถูกต้อง:

.catch(error: any => this.displayError(error));

นั่นเป็นเพียงกฎไวยากรณ์ของ TypeScript

มีการจดชวเลขสำหรับสิ่งที่คุณพยายามทำ:

.catch(this.displayError);

ง่ายกว่ามาก!

person James Monger    schedule 23.09.2016
comment
แน่นอนทำไมฉันถึงไม่คิดอย่างนั้น! ฉันมีความคิดที่จะเพิ่มประเภทให้กับทุกสิ่ง ทุกที่ แม้ว่าพวกเขาจะยังถูกบันทึกอย่างชัดเจนด้วยวิธีสุดท้ายก็ตาม - person msanford; 23.09.2016
comment
โปรดทราบว่าชวเลขไม่สมบูรณ์และจะใช้งานไม่ได้หาก displayError อ้างถึง this ถ้าอย่างนั้นคุณต้อง .catch(this.displayError.bind(this)) - person artem; 24.09.2016

คุณต้องล้อมคู่ name:type ในวงเล็บ ไม่เช่นนั้น parser จะไม่รู้ว่าต้องทำอย่างไร ซึ่งไม่ใช่เรื่องผิดปกติมากนัก เนื่องจากฟังก์ชันลูกศรยังจำเป็นต้องมีวงเล็บเมื่อมีพารามิเตอร์มากกว่าหนึ่งตัวหรืออะไรก็ตามที่ซับซ้อนมากกว่าแค่ foo => bar

เนื่องจากไวยากรณ์ foo : bar สามารถแสดงได้ในที่อื่นๆ สองสามที่ (แบบไตรภาค ตัวอักษรอ็อบเจ็กต์ และป้ายกำกับ) จึงเป็นสิ่งสำคัญอย่างยิ่งที่จะต้องแยกแยะ

person ssube    schedule 23.09.2016

คุณมีไวยากรณ์ที่ถูกต้อง

ใน ES6 ฟังก์ชันลูกศรทั้งสองนี้เทียบเท่ากัน

.catch(error => this.displayError(error));

และ

.catch((error) => this.displayError(error));

อันแรกคือชวเลขที่อนุญาตเฉพาะเมื่อคุณมีพารามิเตอร์ ONE ที่แน่นอนเท่านั้น

ด้วย TypeScript หากคุณกำลังเพิ่มการตกแต่งประเภท คุณต้องใช้รูปแบบที่สองพร้อมวงเล็บ

person Martin    schedule 23.09.2016
comment
หลายปีต่อมา ฉันยังคงใช้เวลาครึ่งหนึ่งของความคิดเห็นของฉันเกี่ยวกับ Stack Overflow เพื่อพูดถึงเรื่องนี้กับผู้คน - person msanford; 23.03.2018