我正在寻找一种拥有嵌套对象的所有键/值对的方法。
(用于 MongoDB 点符号键/值类型的自动完成)
interface IPerson {
name: string;
age: number;
contact: {
address: string;
visitDate: Date;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要实现的目标,使其成为:
type TPerson = {
name: string;
age: number;
contact: { address: string; visitDate: Date; }
"contact.address": string;
"contact.visitDate": Date;
}
Run Code Online (Sandbox Code Playgroud)
在这个答案中,我可以得到密钥Leaves<IPerson>。于是就变成了'name' | 'age' | 'contact.address' | 'contact.visitDate'。
在 @jcalz 的另一个答案中,我可以通过DeepIndex<IPerson, ...>.
是否有可能将它们组合在一起,成为类似的类型TPerson?
当我开始这个问题时,我在想它可以像这样简单[K in keyof T]: T[K];,只需进行一些巧妙的转换。但是我错了。这是我需要的:
所以界面
interface IPerson { …Run Code Online (Sandbox Code Playgroud) javascript mongodb mongodb-query typescript typescript-generics
我有一个案例,我想“合并”默认类型加入(即T | U或T & U)无法实现我想要的类型。
我想要做的是一个深度和智能的类型合并,它会在合并过程中自动将属性标记为可选,并执行 TypeScript 接口/类型的深度合并。
举个例子,假设我们有类型A和B。
type A = {
a: string;
b: number;
c: boolean;
d: {
a2: string;
b2: number;
};
e?: number;
};
type B = {
a: string;
b: boolean;
d: {
a2: string;
c2: boolean;
};
};
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个Merge可以接受 2 种泛型类型的函数
type Merge<T, U> = ?????;
Run Code Online (Sandbox Code Playgroud)
然后,如果在类型Aand 上使用B,输出将如下所示
type AB = {
a: string;
b: number | boolean;
c?: …Run Code Online (Sandbox Code Playgroud) 类中的getters是只读属性,因此从下面的代码中抛出类型错误是有意义的.
class Car {
engine: number;
get hp() {
return this.engine / 2;
}
get kw() {
return this.engine * 2;
}
}
function applySnapshot(
car: Car,
snapshoot: Partial<Car> // <-- how to exclude readonly properties?
) {
for (const key in snapshoot) {
if (!snapshoot.hasOwnProperty(key)) continue;
car[key as keyof Car] = snapshoot[key as keyof Car];
// Cannot assign to 'hp' because it is a constant or a read-only property.
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法如何投射可写的属性来键入和排除所有的getter?
是否可以使用 Typescript 的条件类型检查接口是否具有必填字段?
type AllRequired = { a: string; b: string }
type PartiallyRequired = { a: string; b?: string }
type Optional = { a?: string; b?: string }
// Is it possible to change this, so the below works
type HasRequiredField<T> = T extends {} ? true : false
type A = HasRequiredField<AllRequired> // true
type B = HasRequiredField<PartiallyRequired> // true
type C = HasRequiredField<Optional> // false
Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的类型:
type User = {
uid: string,
displayName?: string,
bestFriend?: string,
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用某种映射类型从我的用户类型中提取可选属性?我正在寻找如何定义以下
OptioanlProperties<T>类型。
type OptionalUserProperties = OptionalProperties<User>
// type OptionalUserProperties = "displayName" | "bestFriend"
Run Code Online (Sandbox Code Playgroud)
我的用例是计算UpdateOf<User>允许特定“操作”值的类型,例如DeleteProperty将其分配给基本类型中可选的键。
export type UpdateOf<T> =
// optional fields may be their own type, or the special DeleteProperty type.
{ [P in OptionalProperties<T>]?: T[P] | DeleteProperty } &
// required fields may be changed, but cannot be deleted.
{ [P in Diff<keyof T, OptionalProperties<T>>]?: T[P] }
Run Code Online (Sandbox Code Playgroud) 给定一个具有可选属性的对象类型,例如:
\ninterface Person {\n name: string;\n age: number;\n friends?: Person[];\n jobName?: string;\n}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa6 我想删除它的所有可选属性,以便结果是:
\ninterface Person {\n name: string;\n age: number;\n}\nRun Code Online (Sandbox Code Playgroud)\n我怎样才能做到这一点?
\n请注意,我无法使用,Omit<Person, "friends" | "jobName">因为事先不知道实际属性。我必须以某种方式收集所有可选属性的键的并集:
type OptionalKey<Obj extends object> = {\n [Key in keyof Obj]: /* ... */ ? Key : never;\n}[keyof Obj];\n\ntype PersonOptionalKey = OptionalKey<Person>;\n// "friends" | "jobName"\nRun Code Online (Sandbox Code Playgroud)\n另外,打字稿删除可选属性的命名很糟糕,并且不能回答我的问题。
\n考虑 TypeScript 中的以下接口lib.d.ts:
interface HTMLElement extends Element {
accessKey: string;
readonly children: HTMLCollection;
contentEditable: string;
readonly dataset: DOMStringMap;
dir: string;
draggable: boolean;
// ... many more
}
Run Code Online (Sandbox Code Playgroud)
我如何仅从该界面中选择不属于 的属性readonly,而无需手动识别和输入所有属性(如下所示)?
type WriteableHTMLElProps = Pick<HTMLElement, "accessKey"|"contentEditable" /* ... */>
Run Code Online (Sandbox Code Playgroud)
注意:正确的解决方案还readonly应该处理该扩展的接口的非属性。
这是我的界面
interface X {
key: string
value: number | undefined
default?: number
}
Run Code Online (Sandbox Code Playgroud)
但是我只想要非可选键。"key" | "value",或者"key"(对我都很好)
type KeyOfX = keyof X给我"key" | "value" | "default"。
type NonOptionalX = {
[P in keyof X]-?: X[P]
}
Run Code Online (Sandbox Code Playgroud)
type NonOptionalKeyOfX = keyof NonOptionalX给出"key" | "value" | "default"的-?仅删除任意的改性剂,让所有的人都非可选。
ps。我使用Typescript 2.9。