TypeScript: คุณสมบัติของอินเตอร์เฟสขึ้นอยู่กับคุณสมบัติอื่น
เป็นไปได้ไหมที่จะพิมพ์คุณสมบัติของอินเทอร์เฟซขึ้นอยู่กับคุณสมบัติอื่น
ตัวอย่างเช่นฉันมี:
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
คุณต้องมีชื่อสามัญเพื่อจับประเภทของสตริงเฉพาะ
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`
});
ลิงค์สนามเด็กเล่น