函数,该函数返回与在typescript中接受的对象形状相同的对象形状

new9mtju  于 2023-05-08  发布在  TypeScript
关注(0)|答案(1)|浏览(134)

我想约束一个函数,使它接受一个对象作为参数,并返回一个完全相同形状的对象。该对象的键可以是任何字符串,我想告诉typescript,返回对象具有相同的键。即

interface ConstrainedObject {
  [key: string]: string[];
}

function transformer(argument: ConstrainedObject): ConstrainedObject {
  // ... code here
}

因此,这个函数可以接受一个键为 any string的对象,但它应该强制返回值具有相同的键。即

const result = transformer({
  linda: ['1', '2', '3'],
  jacob: ['4', '5', '6']
})

result.linda; // allowed, and intellisense should help here
result.jeremy // should error, as the object passed to transformer did not have this key

这在打字机上可能吗?

flvlnr44

flvlnr441#

当你给某个对象或Map类型加上Record<string, string[]>标签时,你就是在向编译器明确地说这个对象有一个松散的模式。别那么做然后,您可以将对象的推断类型与泛型约束组合:

function transform<T extends Record<string, string[]>>(x: T): T {
    // modify x
    return x;
}

现在当你叫它

const x = transform({
  foo: ['a', 'b'],
});

你可以引用x.foo并编译,自动完成等等。我们有一个类型T,我们知道它与您设置的模式匹配,但编译器可以为T推断出一个 * 更具体 * 的类型(在本例中为{ foo: string[] })。
如果你想让transform更通用,你可以在泛型约束中用unknown替换string[],它会更通用,尽管对于身份函数以外的任何东西,实现可能会变得棘手。

function transform2<T extends Record<string, unknown>>(x: T): T {
  // modify x
  return x;
}

const y = transform2({
  a: true,
  b: 'hi',
  c: 5
});

const { a, b, c } = y;
console.log(a); // true
console.log(b.repeat(2)); // compiler knows it's a string, can call string method
console.log(c.toFixed(2)); // same for number here

相关问题