Gui*_*ota 5 generics typescript
我的目标是输入removeUrl函数:
type MyType = {
name: string;
last_name: string;
children_url: string;
children2_url: string;
children3_url: string;
// ...
}
function removeUrls(target: MyType): MagicType {
const result = {}
for (const key in target) {
if (!key.includes('_url')) {
result[key] = target[key]
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这可能是一个简单的问题,但我是打字稿泛型世界的新手,很难找到任何好的谷歌结果来解决这个问题:/
这在 Typescript 4.0 上是不可能的。
但在未发布的 4.1 beta 中,通过模板文字类型,您有一些选择!
如果你是打字稿新手,这看起来会有点奇怪:
type UrlKeys<T> = {
[K in keyof T]: K extends `${infer Prefix}_url` ? K : never
}[keyof T]
type RemoveUrls<T> = Omit<T, UrlKeys<T>>
Run Code Online (Sandbox Code Playgroud)
该UrlKeys类型迭代对象属性。对于每个键,如果该键末尾K有 some ,则返回该键名称,否则返回。最后得到所有未分配给 never 的键的并集。Prefix_urlnever[keyof T]
然后RemoveUrls简单地采用一个类型并Omits 任何将被视为_urls 的键。
您可以像这样使用这些类型:
function removeUrls<T>(target: T): RemoveUrls<T> {
const result: Partial<T> = {}
for (const key in target) {
if (!key.includes('_url')) {
result[key] = target[key]
}
}
return result as T;
}
const result = removeUrls({ a: 123, b_url: 'http://example.com' }) // type: { a: number }
Run Code Online (Sandbox Code Playgroud)
请注意,该函数现在具有T接受任何类型的通用参数。并且返回值是相同的类型,减去 url 属性。
另外,当像这样一次构建一个属性时,您需要将正在进行的对象键入为 a,Partial以确保在构建时并非所有属性都存在。然后在 return 语句中,您可以将其转换回完整值T,因为您知道您已经处理了所有属性。