[英]Is it possible to define a type-safe handle in TypeScript?
我希望能够在TypeScript中定义与HANDLE或HWND等效的类型安全。 用例正在实例化一个具体类型,该类型作为不透明类型提供给用户,用户只能将其用作其他API函数的输入。 类似于以下内容:
module foo {
export
class Handle<T> {
}
class Property extends Handle<Property>
{
constructor(public value = 12) { super(); }
}
export interface IProperty { }
export function makeProperty(): Handle<IProperty> {
return new Property();
}
export function getPropertyValue(p: Handle<IProperty>) {
return (<Property>p).value;
}
}
module bar {
var s = foo.makeProperty();
var p = foo.getPropertyValue(12); // this should be a compile error
}
我遇到了2个问题:
有人做过这样的事吗?
对于
var p = foo.getPropertyValue(12); // this should be a compile error
它不是编译错误,因为TypeScript使用结构类型系统而不是C#/ JAVA等中可能习惯的名义类型系统。
这意味着如果类型( 名称 )匹配,则它们的成员 (结构)匹配,这两种类型是兼容的。 例如以下没事
class Foo{}
var foo:Foo = 123; // okay since number contains everything that a Foo needs (which is nothing)
但是以下情况并不可行:
class Foo{
bar:number;
}
var foo:Foo = 123; // Error NOT okay since number doesn't contain member bar
只需添加一些对Handle
唯一的属性,该属性在无效类型上不存在。 例如,我在下面添加了属性value:number
,导致按预期方式导致编译错误:
module foo {
export class Handle<T> {
constructor(public value:number){}
}
class Property extends Handle<Property>
{
constructor(public value = 12) { super(value); }
}
export interface IProperty { }
export function makeProperty(): Handle<IProperty> {
return new Property();
}
export function getPropertyValue(p: Handle<IProperty>) {
return (<Property>p).value;
}
}
module bar {
var s = foo.makeProperty();
var p = foo.getPropertyValue(12); // Compile Error
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.