带索引的打字稿对象键

Typescript object key with index

我想用这样的索引声明键

interface myType {
        delivery_name1: string;
        delivery_name2: string;
        delivery_name3: string; 
        delivery_name4: string; 
        delivery_name5: string;
        ...n(20)
   }

我试过了

  type Index ="1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"  ...
    type delivery_name = `delivery_name${Index}`

interface myType {
    [key: delivery_name]:string;
}

但是出错了。 An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead

如何解决?

在这种情况下,您不能使用 interface 作为类型。请改用 type

type Index ="1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
type delivery_name = `delivery_name${Index}`

type myType = {
    [key in delivery_name]: string;
}

TypeScript Playground

Reference

添加到 Edwins 优秀答案,如果你想这样做 n 次...

type MakeSeries<T extends number,R extends unknown[] = []> = T extends R['length'] 
? never
: [...R,unknown]['length'] | MakeSeries<T, [...R, unknown]>


type Index = MakeSeries<20> // <-- n times
type delivery_name = `delivery_name${Index}`

type myType = {
    [key in delivery_name]: string;
}
//**
type myType = {
delivery_name1: string;
delivery_name2: string;
delivery_name3: string;
delivery_name4: string;
delivery_name5: string;
delivery_name6: string;
delivery_name7: string;
... 12 more ...;
delivery_name20: string;
**//

}

TypeScript Playground