打字稿传递变量作为泛型类型参数

时间:2021-03-20 04:19:37

标签: typescript typescript-typings typescript-generics

我有一个函数,它接受字符串或字符串数​​组并返回一个带有这些字符串键的对象。

这里是虚拟函数:

type myType<T extends string> = { [K in T]: string }
const myFunc = <T extends string>(param: T | T[]): myType<T> => {
    let result = <myType<T>>{}
    // some codes here...
    return result;
}

通过上面的代码,我已经做到了:

let val = myFunc(['foo', 'bar']);
val.foo // valid
val.other // invalid

但是如果我将变量传递给函数,则所有字符串键都有效:

let variable = ['foo', 'bar'];
let val = myFunc(variable);
val.foo // valid
val.other // valid

是否有解决方法,以便我可以传递一个变量,但仍按预期工作?

1 个答案:

答案 0 :(得分:0)

当您创建变量 let variable = ['foo', 'bar'] 时,variable 的类型变为 string[],您将丢失数组中特定字符串的知识。您需要使用 as const 以便 Typescript 将 variable 解释为字符串文字 'foo''bar' 的固定元组。由于此固定元组是 readonly,因此您还需要修改您的函数以接受 readonly 数组。

const myFunc = <T extends string>(param: T | readonly T[]): myType<T> => {
let variable = ['foo', 'bar'] as const;
let val2 = myFunc(variable);
val2.foo // valid
val2.other // invalid

Typescript Playground Link