- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何填充类型化数组,其中填充的类型具有函数 (getReadableSchedule)?如果我删除该功能,则该功能有效。这是因为我分配数组元素的方式而失败吗?
ERROR in src/app/mock-extracts.ts(3,14): error TS2322: Property 'getReadableSchedule' is missing in type '{ id: number; name: string; description: string; client: string; vendor: string; extractType: str...'.
export class Extract {
id: number;
name: string;
description: string;
client: string;
vendor: string;
extractType: string;
path: string;
sentDate: string;
sentTo: string;
lastRun: string;
nextRun: string;
schedule: string;
getReadableSchedule(): string {
return "<return readable cronjob schedule>";
}
}
import { Extract } from "./extract";
export const EXTRACTS: Extract[] = [
{
id: 1,
name: "Find Barb",
description: "Find Barb in the unspide down.",
client: "Tower, Inc",
vendor: "Vendy",
extractType: "Normal",
sentDate: "Today",
path: "//outside",
sentTo: "",
lastRun: "",
nextRun: "",
schedule: ""
},
{
id: 2,
name: "Rescue Will",
description: "Give Will a hair cut.",
client: "Tower, Inc",
vendor: "Vendy",
extractType: "Normal",
sentDate: "Today",
path: "//outside",
sentTo: "",
lastRun: "",
nextRun: "",
schedule: ""
},
{
id: 3,
name: "Sooth Harry's Scar",
description: "Put Robitussin on Harry's scar.",
client: "Tower, Inc",
vendor: "Turkish Barn, LLC",
extractType: "Normal",
sentDate: "Today",
path: "//outside",
sentTo: "",
lastRun: "",
nextRun: "",
schedule: ""
}
];
最佳答案
错误发生是因为数组中包含的对象字面量与Extract 类的精确 类型结构不匹配。
First option:
为了使其仅需少量更改即可工作,将键 getReadableSchedule 添加为每个对象的最后一个属性,并将其指向类原型(prototype)中的方法:
{
id: 1,
name: "Find Barb",
description: "Find Barb in the unspide down.",
client: "Tower, Inc",
vendor: "Vendy",
extractType: "Normal",
sentDate: "Today",
path: "//outside",
sentTo: "",
lastRun: "",
nextRun: "",
schedule: "",
getReadableSchedule: Extract.prototype.getReadableSchedule// < -this will point to the same method in the class.
},
Second option:
只需为每个对象创建一个实例,将其分配给一个变量,为其属性分配值,然后将该变量添加到数组中,以这种方式创建的所有对象都已经可以访问该方法,因此不需要其他更改:
const EXTRACTS: Extract[] = [];
let a = new Extract();
a.propA = ...;
a.propB = ...;
.
.
.
EXTRACTS.push(a);
let b = new Extract();
b.propA = ...;
.
.
.
EXTRACTS.push(b);
Third option:
如果不打算使用类作为构造函数,使用接口(interface)可能更有意义。所以,在类之外,声明一个等同于类方法的简单函数...
export function getReadableSchedule(): string {
return "<return readable cronjob schedule>";
}
在类内部,移除方法体,只留下签名
getReadableSchedule(): string;
并将类型声明中的class更改为interface,然后将其导出。
export interface Extract {
.
.
.
}
现在像以前一样将对象文字添加到 EXTRACT 数组,唯一仍然需要更改的是导入 getReadableSchedule 并将其添加到每个对象:
import { Extract, getReadableSchedule } from "./extract";
const EXTRACTS: Extract[] = [
{
id: "whatever",
...,
...,
...,
getReadableSchedule // <- this will point to the imported function
} //<- and now all the properties are compatible with the type interface
];
TypeScript 类型系统只检查类型的结构。所以类...
class Extract {
name: string;
getReadableSchedule() {
return "Some message";
}
}
具有以下类型结构......
{
name: string;
getReadableSchedule(): string;
}
要为上述类型的某些变量分配对象字面量,该文字必须具有该类型中存在的所有属性,而没有其他属性。
var fail1: Extract = { name: "1st failure" }; // does not type check - Missing property "getReadableSchedule"
var fail2: Extract = { getReadableSchedule() { return this.name; } }; // does not type check - Missing property "name";
var fail3: Extract = { // does not type check also!
name: "3rd failure", // Ok!
getReadableSchedule() { return this.name } //Ok!
id: 1 // Error - property "id" does not exist in type Extract
};
var success: Extract = {
name: "Success",
getReadableSchedule() { return "Ok!"}
}; // <- No errors;
// But it is ok to assign a Variable that has all properties existent
// in the type and additional ones
var notNamedType = {
name: "Also works",
getReadableSchedule() { return this.name },
id: 1 // property does not exist in the Extract type but...
}
let alsoWorks: Extract = notNamedType; // no casting needed and works as well;
关于typescript - 类型中缺少属性 'getReadableSchedule',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47239507/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!