相关疑难解决方法(0)

Typescript:如何将类型的属性过滤为特定类型的属性?

我有一个界面

export interface MyInterface {
    a: number;
    b: string;
    c: number;
}
Run Code Online (Sandbox Code Playgroud)

我想创建属性名称的文字类型,其值是数字类型

我知道如何使用所有属性名称获取类型

type MyType = keyof MyInterface // gives 'a'|'b'|'c'
Run Code Online (Sandbox Code Playgroud)

我只想得到 'a'|'c'

typescript

16
推荐指数
1
解决办法
1万
查看次数

TypeScript 泛型条件类型作为泛型函数的返回值

背景

作为我正在开发的数据分析库的一部分,我正在创建一组从字符串中读取某些类型的值的函数。这个想法本质上是定义 CSV 文件的结构,这样我就可以将其每个单元格作为字符串读取,并且知道它应该是什么类型,然后将该字符串转换为适当类型的值。

有些单元格包含多个值,并被转换为数组。其他单元格包含单个值。

我在这里所做的部分工作是删除与预期不符的值,并记录警告。对于包含数组的单元格,我很高兴结果仍然是一个数组,即使它是空的。但对于包含单个值的单元格,我想将无效值转换为null.

为此,我设置了一个由所有这些“转换器”函数共享的泛型类型,它返回与这些要求匹配的条件类型:

type TransformerFn<T> = (value: string, locationIdentifier?: string) => T extends any[] ? T : (T | null);
Run Code Online (Sandbox Code Playgroud)

在我迄今为止实现的简单情况下,例如将字符串拆分为字符串数组或提取布尔值,这工作得很好。TransformerFn<string[]>TypeScript 在解决or的条件时没​​有问题TransformerFn<boolean>

但我拥有的一个变压器本质上是为了确认列中的每个单元格要么为空,要么包含 string 中的值enum,在这里我遇到了问题。

我一直在输入该字符串枚举,就像Record<string, string>将其用作函数参数时一样,它运行良好。但是,最近我添加了一些功能来重新编码显然应该是特定枚举值但尚未正确加载的数据。

为了实现这一点,我使用了带有约束的泛型类型来表示字符串枚举值的并集:

export function enumValue<E extends string>(enums: Record<string, E>, recodeMap?: Record<string, E>)
Run Code Online (Sandbox Code Playgroud)

这一直工作得很好,直到我尝试添加TransformerFn之前提到的打字。

问题

尽管我的泛型类型E有一个约束 it extends string,这意味着E extends any[]永远不会为真,但 TypeScript 无法解析我的泛型条件类型。

这是它给我的错误:

类型 '(值: 字符串, locationIdentifier?: 字符串 | 未定义) => E | …

typescript typescript-generics conditional-types

7
推荐指数
1
解决办法
6578
查看次数

考虑中间可选键来推断嵌套值类型

我正在尝试定义帮助器类型来确定嵌套对象值的类型,同时还考虑任何可选的父键,例如在这样的(或更深的)结构中:

type Foo = { a: { b?: number; } };

type Foo2 = { a?: { b: number } };
Run Code Online (Sandbox Code Playgroud)

对于我而言,类型bFooFoo2应被推断为number | undefined。在Foo2b不是可有可无的本身,而是因为a,对于我的查找目的b现在必须是可选的太多......这么多的情况下。

使用这些辅助类型(从更大的集合中提取)作为构建块:

type Keys<T> = keyof Required<T>;

type IsOpt<T> = T extends undefined ? true : never;

type HasOptKey1<T, A> = A extends Keys<T> ? IsOpt<T[A]> : never;

type HasOptKey2<T, A, B> = A extends Keys<T>
    ? IsOpt<T[A]> extends …
Run Code Online (Sandbox Code Playgroud)

type-inference typescript mapped-types conditional-types

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