ค้นหาเว็บไซต์

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> ได้แล้ว

บทความที่เกี่ยวข้อง