gpt4 book ai didi

基于第一项数组的值的数组第二项的 typescript 值

转载 作者:行者123 更新时间:2023-12-03 20:56:17 24 4
gpt4 key购买 nike

我有数组对象,其中每个数组都是对 [value, function] ,其中 function 在参数中接受 value :

const items = {
first: ['a', val => val.length], // val should be string
second: [[1, 2], val => val.push(3)] // val should be number[]
}

有没有办法将函数参数(第二个数组项)的类型设置为与第一个数组项的类型相同?我创建了这个,但它不起作用(一种函数参数总是未知的):
type Items = {
[key: string]: any extends [infer Value, any] ? [Value, (val: Value) => any] : never
}

const items: Items = {
first: ['a', val => val.length], // val should be string, but is unknown
second: [[1, 2], val => val.push(3)] // val should by number[], but is unknown
}

最佳答案

这是 hinosxz 的答案( Playground )的一个更安全的替代方案:

type Items = {
[K: string]: Item<any, unknown>
}
type Item<T, U> = [T, (t: T) => U]

const item = <T, U>(...args: Item<T, U>) => args // factory fn

const items: Items = {
first: item('a', val => val.length), // works
second: item([1, 2], val => val.push(3)), // works

third: item({}, val => val.length), // error (good)
fourth: item({ 0: 1 }, val => val.push(3)) // error (good)
}

笔记:

对于 index signature ,所有属性值必须具有相同的类型。所以你不能有效地使用泛型类型参数。

此外,TS 目前缺乏像 correlated types 这样的结构来表达,属性键与其每个属性的值之间存在关系,而不是所有属性在一起。

为了解决这个问题,我们可以像往常一样显式输入所有属性(为简单起见省略),或者选择更广泛的 Items 基类型并使用 Item 类型和 item 工厂函数单独检查所有属性,如上所示。

最好不要在这里使用 type assertion,因为它的编译器检查比常规赋值检查要宽松得多。例如带有类型断言的 thirdfourth wouldn't trigger an error

关于基于第一项数组的值的数组第二项的 typescript 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60898945/

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