Typescript 如何确保一个接口只包含来自另一个接口的属性?
假设我有以下接口Typescript 如何确保一个接口只包含来自另一个接口的属性?,typescript,Typescript,假设我有以下接口 接口客户端{ id:编号; 电子邮件:字符串; 名字:字符串; lastName:string; cellNumberFull:字符串; } 我希望下面的接口只包含GoClient中存在的属性 interface ClientRestricted { firstName: string; lastName: string; cellNumberFull: string; foo: string; // This would throw an error }
接口客户端{
id:编号;
电子邮件:字符串;
名字:字符串;
lastName:string;
cellNumberFull:字符串;
}
我希望下面的接口只包含GoClient
中存在的属性
interface ClientRestricted {
firstName: string;
lastName: string;
cellNumberFull: string;
foo: string; // This would throw an error
}
寻找某个与延伸相反的国王。这样的东西存在吗?我倾向于让您的接口扩展一个映射的条件类型,它本身就是一个函数。它是一个递归类型定义(称为),允许您执行一些相当强大(如果混淆的话)的类型约束。例如:
type Restrict<T, U> = { [K in keyof U]: K extends keyof T ? T[K] : never };
type RestrictClient<U> = Restrict<Client, U>;
// okay as desired
interface Okay extends RestrictClient<Okay> {
firstName: string;
lastName: string;
cellNumberFull: string;
}
// error, as desired
interface Extra extends RestrictClient<Extra> {
// ~~~~~
// Types of property 'foo' are incompatible.
// Type 'string' is not assignable to type 'never'.
firstName: string;
lastName: string;
cellNumberFull: string;
foo: string;
}
如果它与您要查找的内容不完全匹配,您可以更改Restrict
的定义,以便与它更紧密地对齐。无论如何,希望这能给你一些想法。祝你好运
// okay to narrow properties
interface Narrowed extends RestrictClient<Narrowed> {
firstName: "specificString";
}
// error to widen properties
interface Widened extends RestrictClient<Widened> {
// ~~~~~~~ <-- number not assignable to string
firstName: string | number;
}
// error to change property to unrelated types
interface Unrelated extends RestrictClient<Unrelated> {
// ~~~~~~~~~ <-- number not assignable to string
firstName: number;
}