相关疑难解决方法(0)

Typescript:嵌套对象的深层 keyof,具有相关类型

我正在寻找一种拥有嵌套对象的所有键/值对的方法。

(用于 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

修改 9/14:用例,需要和不需要:

当我开始这个问题时,我在想它可以像这样简单[K in keyof T]: T[K];,只需进行一些巧妙的转换。但是我错了。这是我需要的:

1. 索引签名

所以界面

interface IPerson { …
Run Code Online (Sandbox Code Playgroud)

javascript mongodb mongodb-query typescript typescript-generics

15
推荐指数
2
解决办法
8990
查看次数

TypeScript 类型合并

我有一个案例,我想“合并”默认类型加入(即T | UT & U)无法实现我想要的类型。

我想要做的是一个深度和智能的类型合并,它会在合并过程中自动将属性标记为可选,并执行 TypeScript 接口/类型的深度合并。

举个例子,假设我们有类型AB

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)

types typescript typescript-generics typescript-typings

9
推荐指数
1
解决办法
3467
查看次数

如何从typescript中的type中排除getter only属性

类中的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?

在操场上的例子

getter types typescript typescript2.0

4
推荐指数
2
解决办法
1643
查看次数

检查接口是否有必填字段

是否可以使用 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)

typescript conditional-types

4
推荐指数
1
解决办法
1531
查看次数

打字稿:如何仅从类型中提取可选键?

假设我有一个这样的类型:

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)

typescript

3
推荐指数
1
解决办法
882
查看次数

如何从类型中省略可选属性?

给定一个具有可选属性的对象类型,例如:

\n
interface Person {\n  name: string;\n  age: number;\n  friends?: Person[];\n  jobName?: string;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 我想删除它的所有可选属性,以便结果是:

\n
interface Person {\n  name: string;\n  age: number;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我怎样才能做到这一点?

\n
\n

请注意,我无法使用,Omit<Person, "friends" | "jobName">因为事先不知道实际属性。我必须以某种方式收集所有可选属性的键的并集:

\n
type OptionalKey<Obj extends object> = {\n  [Key in keyof Obj]: /* ... */ ? Key : never;\n}[keyof Obj];\n\ntype PersonOptionalKey = OptionalKey<Person>;\n// "friends" | "jobName"\n
Run Code Online (Sandbox Code Playgroud)\n

另外,打字稿删除可选属性的命名很糟糕,并且不能回答我的问题。

\n

properties typescript conditional-types

3
推荐指数
1
解决办法
3788
查看次数

如何从界面中仅选择非只读字段?

考虑 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应该处理该扩展的接口的非属性。

typescript

2
推荐指数
1
解决办法
953
查看次数

在打字稿中获取`keyof`非可选属性名称

这是我的界面

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。

typescript

1
推荐指数
2
解决办法
761
查看次数