TypeScript:将字符串转换为对象中的数字

zy1mlcev  于 2023-02-05  发布在  TypeScript
关注(0)|答案(1)|浏览(229)

我想写一个函数把对象中的一个特定值从字符串转换成数字。
下面是我的函数:

export function convertStringToNumber<K extends string>(
  obj: Record<K, object>,
  val: string
): Record<K, number> {
  const result: Partial<Record<K, unknown>> = {}
  for (const key in obj) {
    if (key === val) {
      result[key] = Number(obj[key])
    } else {
      result[key] = obj[key]
    }
  }
  return result as Record<K, number>
}

我的函数可以工作,但是我的TypeScript抱怨类型。TypeScript可以接受输入类型,然后将相应键的类型更改为数字吗?
我有第二个版本,也许这个版本更合适:

export function convertStringToNumber2<T> (
  obj: T,
  val: string
): T {
  const result: Partial<T> = {}
  for (const key in obj) {
    if (key === val) {
      result[key] = Number(obj[key])
    } else {
      result[key] = obj[key]
    }
  }
  return result
}

TypeScript正在抱怨:类型"number"不能赋给类型"T [Extract〈keyof T,string〉]"。ts(2322)

pw9qyyiw

pw9qyyiw1#

通过使用两个泛型,你可以在实用程序类型Omit<Type, Keys>Record<Keys, Type>的帮助下从你的输入中派生出一个返回类型,如下所示:
TSPlayground

function convertStringToNumber <
  O extends Record<string, unknown>,
  K extends keyof O
>(obj: O, key: K): Omit<O, K> & Record<K, number> {
  return {...obj, [key]: Number(obj[key])};
}

const input = {
  a: "1",
  b: "2",
  c: "x",
};

const output1 = convertStringToNumber(input, "a");
console.log(output1); // { a: 1, b: "2", c: "x" }

const output2 = convertStringToNumber(input, "c");
console.log(output2); // { a: "1", b: "2", c: NaN }

从TS Playground编译的JS:

"use strict";
function convertStringToNumber(obj, key) {
    return { ...obj, [key]: Number(obj[key]) };
}
const input = {
    a: "1",
    b: "2",
    c: "x",
};
const output1 = convertStringToNumber(input, "a");
console.log(output1); // { a: 1, b: "2", c: "x" }
const output2 = convertStringToNumber(input, "c");
console.log(output2); // { a: "1", b: "2", c: NaN

相关问题