我在TypeScript中创建了一个对象数组:

 userTestStatus xxxx = {
    "0": { "id": 0, "name": "Available" },
    "1": { "id": 1, "name": "Ready" },
    "2": { "id": 2, "name": "Started" }
 };

有人能告诉我如何正确地声明它的类型吗?它是可能做内联或我需要两个定义?

我希望用一个类型声明替换xxx,这样以后如果我使用userTestStatus[3]之类的东西,TypeScript就会提醒我。不小心叫了我的名字。


当前回答

最好使用原生数组,而不是具有类似数字属性的对象文字,这样就可以随时处理编号(以及许多其他数组函数)。

你在这里寻找的是数组的内联接口定义,它定义了数组中的每个元素,无论是最初出现的还是后来引入的:

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

如果你马上用值初始化你的数组,显式类型定义是不必要的;TypeScript可以从初始赋值自动推断出大多数元素类型:

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

其他回答

一些tslint规则禁止使用[],示例消息:使用'T[]'的数组类型被禁止用于非简单类型。使用'Array<T>'代替。

然后你可以这样写:

var userTestStatus: Array<{ id: number, name: string }> = Array(
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
);

数组<T>

person: Array<{
  name: string;
  age: number;
}>

最好使用原生数组,而不是具有类似数字属性的对象文字,这样就可以随时处理编号(以及许多其他数组函数)。

你在这里寻找的是数组的内联接口定义,它定义了数组中的每个元素,无论是最初出现的还是后来引入的:

let userTestStatus: { id: number, name: string }[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

如果你马上用值初始化你的数组,显式类型定义是不必要的;TypeScript可以从初始赋值自动推断出大多数元素类型:

let userTestStatus = [
    { "id": 0, "name": "Available" },
    ...
];

userTestStatus[34978].nammme; // Error: Property 'nammme' does not exist on type [...]

您真正想要的可能只是一个枚举

如果您正在寻找一些行为类似于枚举的东西(因为我看到您正在定义一个对象并附加一个顺序ID 0,1,2,并且包含一个您不想拼错的名称字段(例如name vs naaame),那么您最好定义一个枚举,因为顺序ID会自动处理,并为您提供开箱即用的类型验证。

enum TestStatus {
    Available,     // 0
    Ready,         // 1
    Started,       // 2
}

class Test {
    status: TestStatus
}

var test = new Test();
test.status = TestStatus.Available; // type and spelling is checked for you,
                                    // and the sequence ID is automatic

上面的值将被自动映射,例如。"0"代表"Available",您可以使用TestStatus.Available访问它们。当你传递这些时Typescript会强制执行类型。

如果坚持将新类型定义为自定义类型的数组

你需要一个对象数组,(并不是一个键为“0”,“1”和“2”的对象),所以让我们先定义对象的类型,然后定义一个包含数组的类型。

class TestStatus {
    id: number
    name: string

    constructor(id, name){
        this.id = id;
        this.name = name;
    }
}

type Statuses = Array<TestStatus>;

var statuses: Statuses = [
    new TestStatus(0, "Available"),
    new TestStatus(1, "Ready"),
    new TestStatus(2, "Started")
]
 var xxxx : { [key:number]: MyType };