gpt4 book ai didi

额外类型条件的 Typescript key

转载 作者:行者123 更新时间:2023-12-04 16:30:37 28 4
gpt4 key购买 nike

我想为传递数组类型字段名称传递两个通用条件,但不接受第二个条件。

这是我的方法声明,没问题。

firstOrDefault<K extends keyof T>(predicate?: (item: T) => boolean, recursiveItem?: K): T;

上面的方法声明有效,但我只想在 recurviseItem 字段中传递 Array 类型。

我正在尝试此方法声明但不起作用。

firstOrDefault<K extends keyof T & T[]>(predicate?: (item: T) => boolean, recursiveItem?: K): T

如何解决这个问题?

示例代码

let departments : IDepartment[] = [
{
name: 'manager',
subDepartments: [
{
name: 'accountant'
}
]
}
]

// This my method declaration and this code worked but you can pass name and subDepartments field pass for recursiveItem parameter but i want only T[] type field pass so only subDepartments.
let department = departments.firstOrDefault(d => d.name == 'accountant', 'subDepartments')
console.log(department)

interface Array<T> {
firstOrDefault<K extends keyof T>(predicate?: (item: T) => boolean, recursiveItem?: K): T;
}

Array.prototype.firstOrDefault = function(this, predicate, recursiveItem) {
if (!predicate)
return this.length ? this[0] : null;
for (var i = 0; i < this.length; i++) {
let item = this[i]
if (predicate(item))
return item
if (recursiveItem) {
let subItems = item[recursiveItem]
if (Array.isArray(subItems)) {
var res = subItems.firstOrDefault(predicate, recursiveItem)
if (res)
return res
}
}
}
return null;
}

interface IDepartment {
name?: string,
subDepartments?: IDepartment[]
}

最佳答案

试试这个类型定义

type ArrayProperties<T, I> = { [K in keyof T]: T[K] extends Array<I> ? K : never }[keyof T]

class A {
arr1: number[];
arr2: string[];
str: string;
num: number;
func() {}
}

let allArr: ArrayProperties<A, any>; // "arr1" | "arr2"
let numArr: ArrayProperties<A, number>; // "arr1"

所以 firstOrDefault看起来像那样(我把 ArrayProperties<T, T> 限制为递归类型的 recursiveItem,即只能使用 IDepartment[] 类型的属性,但是如果你想接受任何数组,你可以放 ArrayProperties<T, any>)

function firstOrDefault<T>(predicate?: (item: T) => boolean, recursiveItem?: ArrayProperties<T, T>): T { }

以你为例

interface IDepartment {
name: string;
subDepartments?: IDepartment[];
}

let departments : IDepartment[] = [
{
name: 'manager',
subDepartments: [
{
name: 'accountant'
}
]
}
]

let a = firstOrDefault(((d: IDepartment) => d.name === 'accountant'), 'subDepartments'); // OK
let b = firstOrDefault(((d: IDepartment) => d.name === 'accountant'), 'subDepartment'); // error: [ts] Argument of type '"subDepartment"' is not assignable to parameter of type '"subDepartments"'.

关于额外类型条件的 Typescript key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46139715/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com