TypeScript: คุณสมบัติของอินเตอร์เฟสขึ้นอยู่กับคุณสมบัติอื่น

Aug 15 2020

เป็นไปได้ไหมที่จะพิมพ์คุณสมบัติของอินเทอร์เฟซขึ้นอยู่กับคุณสมบัติอื่น

ตัวอย่างเช่นฉันมี:

const object = {
  foo: 'hello',
  bar: { hello: '123', },
}

และฉันต้องการเพื่อให้แน่ใจว่าที่สำคัญของบาร์จะต้องมีค่าของfoo

interface ObjectType = {
  foo: string;
  bar: { hello: string; } // instead of hardcoding have something like this? --> payload: { ValueOfFoo: string; }
}

ขอบคุณ! :)

คำตอบ

5 AluanHaddad Aug 15 2020 at 23:39

คุณต้องมีชื่อสามัญเพื่อจับประเภทของสตริงเฉพาะ

interface ObjectType<K extends string> {
    foo: K;
    bar: { [P in K]: string };
}

จากนั้นคุณสามารถเขียน

const object: ObjectType<'hello'> = {
    foo: 'hello',
    bar: { hello: '123', },
};

หรือถ้าคุณมีฟังก์ชันที่ใช้วัตถุดังกล่าวคุณสามารถใช้อินเทอร์เฟซเพื่อบังคับใช้กฎด้วยการอนุมานแบบเต็ม

function useObject<K extends string>(o: ObjectType<K>) { }

useObject({
    foo: 'hello', 
    bar: { hello: '113' } // works
});

useObject({
    foo: 'hello', 
    bar: { world: '113' }
//         ^^^^^−−−−−−−−−−−− error, `world` should be `hello`
});

ลิงค์สนามเด็กเล่น