typescript1.8 - ทำไมฉันจึงไม่สามารถสืบทอด 'any' ใน Typescript ได้?
ฉันต้องการสร้างอินเทอร์เฟซตัวแทนสำหรับคลาสที่ใช้ไลบรารีภายนอก ดังนั้นฉันจึงสร้าง:
export interface IDatabaseModel extends any
{
}
ฉันอยากจะทำสิ่งนี้ก่อนแล้วค่อยเพิ่มเมธอดในภายหลัง (เช่น findAll()) มากกว่าที่จะต้องทำเครื่องหมายคลาสทั้งหมดของฉันเป็น 'any' และต้องค้นหาและแทนที่ 'any' ด้วย 'IDatabaseModel' ในหลายร้อยตำแหน่งทีละตัวในภายหลัง
แต่คอมไพเลอร์บ่นว่ามันไม่สามารถหา 'any' ได้
ฉันทำอะไรผิดไปหรือ
คำตอบ #1
ด้วยนามแฝงสำหรับ any
ฉันต้องการสร้างอินเทอร์เฟซตัวแทน
ใช้ชื่อแฝง:
type IDatabaseModel = any;
หรือด้วยลายเซ็นดัชนี [แก้ไขตั้งแต่สิงหาคม 2017]
ตั้งแต่ TypeScript 2.2 เป็นต้นมา การเข้าถึงคุณสมบัติด้วยไวยากรณ์ obj.propName จะได้รับอนุญาตพร้อมกับลายเซ็นดัชนี:
interface AnyProperties {
[prop: string]: any
}
type MyType = AnyProperties & {
findAll(): string[]
}
let a: MyType
a.findAll() // OK, with autocomplete
a.abc = 12 // OK, but no autocomplete
คำตอบ #2
สรุปสั้น 2020:
แทนที่จะใช้ extends any ลองใช้ extends Record<string, any> แทน.
เวอร์ชันยาว:
ในบางกรณี extends any ยังคงใช้งานได้ใน TypeScript อย่างไรก็ตาม ใน TypeScript 3.9 มันถูกตีความในลักษณะที่ระมัดระวังมากขึ้น
@Paleo สร้างอินเทอร์เฟซ AnyProperties ในคำตอบของเขา ซึ่งตอนนี้สามารถเขียนใหม่ด้วย Record เป็น extends Record<string, any> ได้แล้ว
