我在TypeScript中创建了一个对象数组:
userTestStatus xxxx = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
有人能告诉我如何正确地声明它的类型吗?它是可能做内联或我需要两个定义?
我希望用一个类型声明替换xxx,这样以后如果我使用userTestStatus[3]之类的东西,TypeScript就会提醒我。不小心叫了我的名字。
一些tslint规则禁止使用[],示例消息:使用'T[]'的数组类型被禁止用于非简单类型。使用'Array<T>'代替。
然后你可以这样写:
var userTestStatus: Array<{ id: number, name: string }> = Array(
{ "id": 0, "name": "Available" },
{ "id": 1, "name": "Ready" },
{ "id": 2, "name": "Started" }
);
最好使用原生数组,而不是具有类似数字属性的对象文字,这样就可以随时处理编号(以及许多其他数组函数)。
你在这里寻找的是数组的内联接口定义,它定义了数组中的每个元素,无论是最初出现的还是后来引入的:
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 [...]
你也可以试试
interface IData{
id: number;
name:string;
}
let userTestStatus:Record<string,IData> = {
"0": { "id": 0, "name": "Available" },
"1": { "id": 1, "name": "Ready" },
"2": { "id": 2, "name": "Started" }
};
查看记录如何工作:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
在我们的例子中,Record用于声明一个对象,该对象的键为字符串,值为IData类型,因此现在当我们尝试访问其属性时,它将为我们提供智能感知,并在我们尝试userTestStatus[0].nameee这样的属性时抛出类型错误