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

typescript - ไม่มีลายเซ็นดัชนีสำหรับชนิด 'string' ในชนิด


type Arg = Record<PropertyKey, unknown>

function foo(d: Arg) {
  console.log(d)
}

type M<T, D> = {
  type: T,
  data: D
}

type MyType1 = M<'bar', {name: string}>

const a1: MyType1 = {type: 'bar', data: {name: 'xxx'}}

// ok
foo(a1)

interface N<T, D> {
  data: D
  type: T
}

type MyType2 = N<'xyz', {name: number}>
const a2: MyType2 = {type: 'xyz', data: {name: 2}}
// error ??
// Argument of type 'MyType2' is not assignable to parameter of type 'D'.
//  Index signature for type 'string' is missing in type 'N<"xyz", { name: number; }>'.
foo(a2)

ts ทำให้ฉันเกิดข้อผิดพลาดเมื่อฉันเขียนโค้ดแบบ foo(a2) แต่ foo(a1) ใช้ได้ ความแตกต่างคือ a1 ใช้ type ส่วน a2 ใช้ interface ฉันไม่รู้ว่าทำไม foo(a2) ถึงผิด

คำตอบ #1

ปัญหาที่นี่คือการใช้คีย์เวิร์ด interface ของคุณ

เพื่อให้มันทำงานได้ คุณควรเพิ่มคุณสมบัติทั้งหมดของ Record ของคุณไปยังการขยายอินเทอร์เฟซ หรือขยายอินเทอร์เฟซโดยตรงด้วยมัน

ถ้าคุณกำลังใช้ชนิด TypeScript จะไม่เข้มงวดกับสิ่งนั้น นั่นคือเหตุผลที่ตัวอย่างแรกของคุณใช้งานได้

interface N<T, D> {
  data: D
  type: T
}

interface A<T, D> {
    data: D,
    type: T,
    [x: PropertyKey]: unknown
}
interface B<T, D> extends Arg {
    data: D,
    type: T,
}
type MyType2 = N<'xyz', {name: number}>
const a2: MyType2 = {type: 'xyz', data: {name: 2}}
type MyType3 = A<'xyz', {name: number}>
const a3: MyType3 = {type: 'xyz', data: {name: 2}}
type MyType4 = B<'xyz', {name: number}>
const a4: MyType4 = {type: 'xyz', data: {name: 2}}
// error ??
// Argument of type 'MyType2' is not assignable to parameter of type 'D'.
//  Index signature for type 'string' is missing in type 'N<"xyz", { name: number; }>'.
foo(a2)
foo(a3)
foo(a4)