定义一般功能类型和适用于功能分配

0

的问题

我可以定义和使用的通用功能是这样的:

const fetchData = <T>(): T[] => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData<string>();

然而,在我国实际情景,我有很多的参数,并想分离出typings和功能的分配。

我已经尝试要写这样的:

type IFetchData = <T>() => T[]

const fetchData2: IFetchData = () => {
  const arr: T[] = []
  // if stuff push to arr
  return arr
}

const emptyStringArray = fetchData2<string>();

然而,现在的功能定义无法识别 T 作为一个可用的类型。

找不到名字的'T'。

我已经尝试了很多不同的配置放在哪里 <T>但似乎没有什么工作-任何想法?

在TS游乐场


相关的问题

typescript typescript-generics
2021-11-24 02:12:27
3

最好的答案

2

IFetchData 是这样做的回返打给你,所以它应该忽略通用从 fetchData2 功能返回。 不会的以下工作?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = () => {
  return [];
}
2021-11-24 02:18:56

接近,但理想的是我会能够保持通用的定义。 它得到了简化出在试图建立一个小例子,但实际上,我在创建最初的阵列和推动obects它更新的实例
KyleMit

嗯,如果你需要访问的一般内部 fetchData2 它似乎喜欢的办法将类似于你的初始办法(没有 IFetchData: const fetchData2 = <T>() => { const arr: T[] = []; return arr;}
Nick
1

首先,这个功能:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push(2) // error
    arr.push('str') // error

    return arr
}

是难以使用。

由于非你的论点是不相关 TTS将不会允许你 push 任何价值 arr. 当然,你可以使用类型的断言 as但这是非常不安全:

const fetchData = <T,>(): T[] => {
    const arr: T[] = []
    arr.push('str' as any as T) // error

    return arr
}

const emptyStringArray = fetchData<number>(); // number[]
emptyStringArray[0].toExponential() // runtime error

相关的 问题的答案, 我的文章

答案是简单和简单的:不可能在这种情况下独立 T 从功能的定义没有解决方法。

在这里,你有最简单的方式:

const fetchData = <T,>() => {
  const arr: T[] = []
  return arr
}

但是,如果你想改变你的阵内 fetchData这签名功能是没有用的。 这一功能是不允许做任何事情 arr. 你所能做的就是回归 arr 没有任何变化。

为了改变这一名单,则需要建立更高阶功能和期间的调用 fetchData 提供明确的通用参数:

type FetchData = <T>() => T[]
const fetchData: FetchData = () => []

const higherOrder = <T,>(elem: T) => {
  const arr = fetchData<T>();
  arr.push(elem)

  return arr
}



const test = higherOrder('str'); // ok, string[]
const test2 = higherOrder(42); // ok, number[]

游乐场

2021-11-24 08:54:18
0

你能试试吗?

type IFetchData = <T>() => T[]
const fetchData2: IFetchData = <T>() => {
  return [];
}
2021-11-24 08:13:59

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................