Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 为什么';这段代码不会导致类型脚本类型错误吗?_Angularjs_Typescript_Typescript1.5 - Fatal编程技术网

Angularjs 为什么';这段代码不会导致类型脚本类型错误吗?

Angularjs 为什么';这段代码不会导致类型脚本类型错误吗?,angularjs,typescript,typescript1.5,Angularjs,Typescript,Typescript1.5,接口定义如下: interface IRemoteService { createRecord(record: RecordType): ng.IPromise<ICreateResponse<string>>; } interface ICreateResponse<T> { createdId: T; } 接口远程服务{ createRecord(记录:记录类型):ng.IPromise; } 接口响应{ createdId:T; } 为什么

接口定义如下:

interface IRemoteService {
  createRecord(record: RecordType): ng.IPromise<ICreateResponse<string>>;
}

interface ICreateResponse<T> {
  createdId: T;
}
接口远程服务{
createRecord(记录:记录类型):ng.IPromise;
}
接口响应{
createdId:T;
}
为什么下面的代码不会导致Typescript编译错误

class RemoteServiceMock implements IRemoteService {
  public static $inject = ["$q"];

  constructor(private $q: ng.IQService){
  }

  createRecord(record: RecordType): ng.IPromise<ICreateResponse<string>> {
    return this.$q.when({});
  }
}
类RemoteServiceMock实现IRemoteService{
公共静态$inject=[“$q”];
构造函数(私有$q:ng.IQService){
}
createRecord(记录:记录类型):ng.IPromise{
返回此.q.when({});
}
}

$q.when
的类型是
when(值:T):I promise
我不确定您为什么没有收到错误,但我有一个关于如何获得警告的建议。根据angular.d.ts
,当
定义如下:

when<T>(value: IPromise<T>): IPromise<T>;
when<T>(value: T): IPromise<T>;
when(): IPromise<void>;

这符合规范。以下是您的简化示例:

interface A{
}
interface B {
  createdId: string;
}

var foo:ng.IPromise<A>;
var bar:ng.IPromise<B>;
bar = foo; // No error
所以 在实际的承诺定义中,我们有如下内容:

interface IPromise<T> {
    then(successCallback: (promiseValue: T) => any): any;
}

interface A {
}
interface B {
    createdId: string;
}

var foo: IPromise<A>;
var bar: IPromise<B>;
bar = foo; // No Error
接口IPromise{
然后(successCallback:(promiseValue:T)=>any):any;
}
接口A{
}
接口B{
createdId:字符串;
}
var foo:IPromise;
var-bar:IPromise;
bar=foo;//无误

由于我们使用
T
作为a函数的参数
a
B
将通过双变量进行类型检查。所以如果A是B的子集或者B是A的子集,它们是相容的

是的。。。“{}”属于“Any”类型,因为“Any”不是类型。。。因为它是“任何类型”。当然{}是Object类型的吗?是的。。。但任何类型都可以是“任意”类型。这就像说。。。“任何事”。。。。哪个“对象”也满足。。。很明显,我的意思是“被{}当作{}对待”,但你是对的,这可能不清楚。已编辑。
ICreateResponse
的定义是什么?上面的示例当然有效。很抱歉在问题的顶部问一个问题,但为什么允许这样做?A没有实现B,因此这似乎会极大地损害接口成员资格的有用性。谢谢!现在更有意义了。:)谢谢,这确实给了我一个很大的错误。
interface A {
  breakTypeCompat: number;
}
interface B {
  createdId: string;
}

var foo:ng.IPromise<A>;
var bar:ng.IPromise<B>;
bar = foo; // Error
interface IPromise<T>{  
}

interface A{
}
interface B {
  createdId: string;
}

var foo:IPromise<A>;
var bar:IPromise<B>;
bar = foo; // No error
interface IPromise<T>{
    member:T    
}

interface A{    
}
interface B {
  createdId: string;
}

var foo:IPromise<A>;
var bar:IPromise<B>;
bar = foo; // Error
interface IPromise<T> {
    then(successCallback: (promiseValue: T) => any): any;
}

interface A {
}
interface B {
    createdId: string;
}

var foo: IPromise<A>;
var bar: IPromise<B>;
bar = foo; // No Error