我安装了带有web essentials 2013的visual studio 2013.我右键单击.cs文件并选择“Web Essentials - >创建Typescript intellisense文件”,这样我就可以获得一个我可以参考的typescript d.ts文件在打字稿代码中。我遇到了一些问题。我们说我的课程如下:
namespace SomeNamespace
{
[TypescriptModule("test")]
[DataContract(Name = "MyDTO")]
public partial class MyPM
{
[DataMember(Name = "id")]
public long Id { get; set; }
[Required]
[DataMember(Name = "name")]
public CustomPM Data{ get; set; }
}
}
我得到的d.ts文件是:
declare module test {
interface MyPM{
id: number;
data: test.CustomPM;
}
}
第一个问题是该行:
[DataContract(Name = "MyDTO")]
在生成期间被忽略。它不会生成一个名为MyDTO的类,而是一个名为MyPM的类,即使MyDTO是指定在序列化期间使用的字符串,也就是通过线路连接到客户端的字符串。我做了一些调查和代码:
表示它使用CodeClass.Name属性来确定类名。有没有办法在类上使用属性(除DataContract Name之外的东西)使CodeClass.Name属性包含除实际类名之外的另一个字符串?
第二个问题是这一行:
data: test.CustomPM;
在安装了typescript的visual studio 2013中,test.CustomPM给出了一个错误,因为它无法在测试模块中找到类型CustomPM,即使该类已生成到同一个“测试”模块中并可用于使用。缺少的部分是d.ts文件顶部的这一行:
/// <reference path="./CustomPM.cs.d.ts"/>
但是,我一直无法找到让生成器生成此方法的方法。
我真的很感激任何人都可以解决一些解决这些问题的方法。谢谢!
答案 0 :(得分:0)
这是一个老问题,我不会直接回答,因为我不知道WebEssentials的这种功能。
但我会给你一个非常好的替代:
TypeLite - http://type.litesolutions.net/
您只需将attribut [TsClass]
放在您想要的类上。
如果您希望TS接口以I
和所有属性camelCase开头,请编辑 TypeLite.Net4.tt :
var ts = TypeScript.Definitions()
.WithReference("Enums.ts")
.ForLoadedAssemblies()
.WithFormatter((type, f) => "I" + ((TypeLite.TsModels.TsClass)type).Name)
.WithMemberFormatter((TypeLite.TsModels.TsProperty identifier) => Char.ToLower(identifier.Name[0]) + identifier.Name.Substring(1));
答案 1 :(得分:0)
您可以在基础tsconfig.json
中引用生成的类型,然后在每个打字稿文件中都不需要自定义引用:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"jsx": "preserve"
},
"files": [
"../typings/index.d.ts",
"./TestForm.tsx",
"./declaration.d.ts",
"../models/models.cs.d.ts"
]
}