打字稿:以目标字符串开头的

时间:2018-11-27 14:17:55

标签: typescript

我想从原始类型中创建新的对象类型 属性键以“目标字符串”开头时应过滤。

来源类型:

type Origin = {
    a: string,
    b: string,
    _c: string,
    _d: string,
}

我想要的结果类型。

// type Result = SomethingWork<Origin, '_'>;
type Result = {
    a: string,
    b: string
};

来源类型具有动态属性键。 所以如果使用像'_c' | '_d'

这样的直接类型,那是不正确的

2 个答案:

答案 0 :(得分:0)

不能使用前缀

但是

import { ITSDiff, ITSPickMember } from 'ts-type';

export type Origin = {
    a: string,
    b: string,
    _c: string,
    _d: string,
}

export type Result = Pick<Origin, ITSDiff<keyof Origin, '_c' | '_d'>>

let a: Result;

a.a.padEnd(1)

a._c // err

export type OriginOnlyHasPrefix = {
    _c: string,
    _d: string,
}

export type Result3 = Pick<Origin, ITSDiff<keyof Origin, keyof OriginOnlyHasPrefix>>

let a3: Result3;

a3.a.padEnd(1)

// @ts-ignore err when without @ts-ignore
a3._c;

答案 1 :(得分:0)

现在可以使用模板文字类型

type FilterNotStartingWith<Set, Needle extends string> = Set extends `${Needle}${infer _X}` ? never : Set

示例:

type Origin = {
  a: string,
  b: string,
  _c: string,
  _d: string,
}

type FilteredKeys = FilterNotStartingWith<keyof Origin, '_'>
type NewOrigin = Pick<Origin, FilteredKeys>
/*
type NewOrigin = {
  a: string;
  b: string;
}
*/