相关疑难解决方法(0)

打字稿日期类型?

如何在TypeScript中表达日期?日期不是TypeScript类型,所以我使用anyobject?似乎会有一种"正确"的方式:

let myDate: any = new Date();
Run Code Online (Sandbox Code Playgroud)

尽管这是一个如此简单的问题,我在谷歌上找不到多少.

date typescript

168
推荐指数
3
解决办法
22万
查看次数

如何在没有“N more”和“...”的情况下查看完全扩展的 TypeScript 类型?

在 VSCode 中,TypeScript 显示了我定义的类型的非常有用的扩展。但是 TS 在 IntelliSense 中显示的内容是有限的。如果一个类型太长,那么我会看到这样的输出:

在此处输入图片说明

注意接近尾声的“11 more”。有时,为了对困难的类型定义进行故障排除,查看“N more”部分中的内容确实很有帮助。

有没有办法获得(用于开发期间的故障排除目的)完全扩展的类型定义,而没有那些“N more”消息来隐藏里面的内容?

https://github.com/Microsoft/vscode/issues/6638暗示截至 2017 年 2 月,此功能可能尚未可用(也未计划),但我不确定我是否正确阅读了该问题,无论情况如何在此期间发生了变化。

intellisense typescript visual-studio-code

20
推荐指数
2
解决办法
3601
查看次数

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 类型的方法

我正在寻找一种方法来查看 TypeScript 将声明的类型解析为的类型(即泛型)。我使用 VS Code,并且经常使用并集、交集或其他通用结果,鼠标悬停时会显示以下信息:

(property) Workspace: Pick<{
    __typename?: "a" | undefined;
} & {
    __typename?: "b" | undefined;
} & Pick<typeA, "id" | ... 4 more ... | "state"> & {
    ...;
}, "__typename" | ... 4 more ... | "state"> & Pick<...>
Run Code Online (Sandbox Code Playgroud)

我知道 VS Code 必须具有完整的类型信息,因为当我尝试错误地使用该类型时,我会收到类似的错误Property 'goo' does not exist on type '...'

我希望有一种方法可以通过某种console.log(someUtilityFunction(type))或某些 vscode 设置或扩展来做到这一点?

typescript visual-studio-code typescript-generics typescript-typings

8
推荐指数
0
解决办法
1282
查看次数

在文件中创建计算类型的导出

我想知道是否有可能给一个具有导出类型的文件,这些类型是否可以从泛型中提取计算类型?

function example() {
  return {
    foo: 'hi',
    bar: true,
    baz: 1
  };
}

export type Signature = ReturnType<typeof example>;
Run Code Online (Sandbox Code Playgroud)

对此:

export type Signature = {
    foo: string;
    bar: boolean;
    baz: number;
}
Run Code Online (Sandbox Code Playgroud)

我不相信tsccli会这样做,我不确定这个过程会被称为什么。

可以tsc创建这个导出吗?

有没有第三方工具可以做到这一点?

我知道如何做到这一点的唯一方法是将鼠标悬停在 VSCode 中的变量上并复制计算类型,并且只有在它很短并且不会减弱时才有效......

我发现了其他一些对类似请求的引用:

typescript

8
推荐指数
1
解决办法
472
查看次数

在 VSCode 中检查嵌套的 TypeScript 接口和类型

使用VSCodewith时,TypeScript我发现自己经常将鼠标悬停在函数或对象上以检查它们的类型。

通常,这些对象的类型和接口依赖于多个其他接口和类型。所以悬停不会提供太多信息。

要检查类型,我必须手动进入例如节点模块以查找类型声明并在那里检查它。

有没有办法轻松检查嵌套类型VSCode

下面是一个例子:

在此处输入图片说明

我想要一种简单的方法来检查React.FunctionComponent.

typescript visual-studio-code

6
推荐指数
1
解决办法
516
查看次数

Typescript 通过鉴别器属性将可区分联合类型的数组分组到记录中

我正在尝试编写通用“groupBy”函数的打字稿签名,该函数会将可区分的类型联合数组“传播”到记录中,其中记录的每个字段都是可能的鉴别器值,并指向具体的对象数组来自工会的类型。

例子:

interface Dog {
  type: 'dog'
  dogMetadata: {}
}

interface Cat {
  type: 'cat'
  catMetadata: {}
}

type Animal = Dog | Cat

const animals: Animal[] = [{ type: 'dog', dogMetadata: {} }, { type: 'cat', catMetadata: {} }]
Run Code Online (Sandbox Code Playgroud)

每个接口都有一个公共鉴别器属性,没有其他公共属性。

这是简单的“groupBy”签名,它不会传播类型联合值,迫使我向下转换记录的值:

function groupBy<T, K extends string>(arr: T[], keyExtractor: (element: T) => K): Record<K, T[]>

const animalsByType: Record<'dog' | 'cat', Animal[]> = groupBy(animals, it => it.type)
const dogs: Dog[] = animalsByType['dog'] as Dog[]  // Must downcast Animal[] to Dog[]
Run Code Online (Sandbox Code Playgroud)

如何制作一个“groupBy”来了解可区分联合类型的具体类型?我想要这样的东西: …

discriminated-union typescript

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

从 Typescript 中的类型中仅选择两个属性

我只需要选择两个名称尚未从类型中定义的属性,然后从那里创建一个新类型,其中一个属性是必需的,另一个属性是可选的。

我知道可以选择一个单一的房产

<T extends Record<string,any>> {
    [K in keyof T]: (Record<K, T[K]> & 
    Partial<Record<Exclude<keyof T, K>, never>>) extends infer U ? { [P in keyof U]: U[P] } : never
}[keyof T]
Run Code Online (Sandbox Code Playgroud)

但没有弄清楚如何(以及是否)可以使用此方法选择两个属性。

下面是我想如何使用它的示例

class Article {
    name: string
    id: number
    content?: string
}

const article: TwoKeys<Article> = { id: 23 } // no error
const article: TwoKeys<Article> = { name: "my article", id: 122 } // no error
const article: TwoKeys<Article> = { name: "my article" , id: 23, …
Run Code Online (Sandbox Code Playgroud)

typescript typescript-generics

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

Typescript 类型转换对象因此特定的必需键在类型中不再是可选的?

假设你有一个对象类型:

type Person = {
  name?: string;
  color?: string;
  address?: string;
}
Run Code Online (Sandbox Code Playgroud)

但是,您想将该类型更改为以下类型,您知道名称和颜色将存在。

type Person = {
  name: string;
  color: string;
  address?: string;
}
Run Code Online (Sandbox Code Playgroud)

因此,有这样的函数

const throwIfUndefined = (
  object: {[key: string]: any},
  requiredKeys: string[]
): ReturnTypeHere => {
  for (const key of requiredKeys) {
    if (!object[key]) throw new Error("missing required key");
  }

  return object;
};
Run Code Online (Sandbox Code Playgroud)

输入函数参数以及返回类型 ( ReturnTypeHere) 的正确方法是什么?如果写得正确,下面的代码将 1) 抛出错误 2) 控制台记录名称。它永远不会控制台日志未定义。

const person = {...}

const requiredKeys = ["name", "color"];
const verifiedPerson = throwIfUndefined(person, requiredKeys);
console.log(verifiedPerson.name)
Run Code Online (Sandbox Code Playgroud)

javascript typescript

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