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)
